下面是人民民主党,我可以复制,需要帮助。
我有奇怪的坠毁,除了1处地方外,有些方法在任何地方都进行罚款。 该法典:
struct base
{
virtual wchar_t* get() = 0; // can be { return NULL; } doesn t matter
};
struct derived: public base
{
virtual wchar_t* get() { return SomeData(); }
};
struct container
{
derived data;
};
// this is approx. how it is used in real program
void output(const base& data)
{
data.get();
}
smart_ptr<container> item = GetItSomehow();
derived &v1 = item->data;
v1.get(); // works OK
//base &v2 = (base&)derived; // the old line, to understand old comments in the question
base &v2 = v1; // or base* v2 doesn t matter
v2.get(); // segmentation fault without going into method at all
现在,正如我说过的那样,我称之为“项目”和“项目”;数据(植被)在许多地方对不同目标都有影响,它始终发挥作用。 除1个地方外。 但是,如果投到基类(output)的话,它就没有做任何工作。
现在的问题是:HOW和WHY,这种情况可能发生? 我怀疑纯粹的虚拟电话,但我没有在建筑商使用虚拟方法。 我看不出这些呼吁是如何不同的。 我怀疑基数方法是抽象的,但如果我增加一个机构,也是一样的。
我不能举一个小的例子来测试,因为正如我所说的那样,它总是发挥作用,只有1个地方除外。 如果我知道为什么不在那里工作,那么我就不需要测试样本,因为这已经是答案。
P.S. The environment is Ubuntu 11.10 x64 but the program is compiled for 32 bit using gcc 4.5.2 custom build.
P.P.S.
warning: can t find linker symbol for virtual table for `derived::get value
warning: found `SomeOtherDerivedFromBaseClass::SomeOtherCrazyFunction instead
in the real program
UPDATE:任何机会都可能发生,因为有相同的名称,但在不同共享的图书馆内,可能会与错误类别挂钩? 几个共享图书馆实际界定的“衍生”类别,更糟糕的是,有另一个名称相同但不同接口的同类。 奇怪的是,它不投身于基类。
我特别有兴趣了解这方面的细节。
这里我似乎照搬了:
// --------- mod1.h
class base
{
public:
virtual void test(int i); // add method to make vtables different with mod2
virtual const char* data();
};
class test: public base
{
public:
virtual const char* data();
};
// --------- mod2.h
class base
{
public:
virtual const char* data();
};
class test: public base
{
public:
virtual const char* data();
};
// --------- mod2.cpp
#include "mod2.h"
const char* base::data() { return "base2"; }
const char* test::data() { return "test2"; }
// --------- modtest.cpp
#include <stdio.h>
// !!!!!!!!! notice that we include mod1
#include "mod1.h"
int main()
{
test t;
base& b = t;
printf("%s
", t.data());
printf("%s
", b.data());
return 0;
}
// --------- how to compile and run
g++ -c mod2.cpp && g++ mod2.o modtest.cpp && ./a.out
// --------- output from the program
queen3@pro-home:~$ ./a.out
test2
Segmentation fault
In the modtest above, if we include "mod2.h" instead of "mod1.h", we get normal "test2 test2" output without segfault.
The question is - what is the exact mechanism for this? How to detect and prevent? I knew that static data in gcc will be linked to single memory entry, but vtables...