遇到遇到warning C4250顺便发现这个问题,自己原来想当然的想法是错的
多个类顺序继承
class A
{
public:
virtual int num(){return 0}
};
class B:public A
{
public:
virtual int num(){return 1}
};
class C:public B
{
public:
virtual int num(){return 2}
};
class D:public C
{
public:
};
A* pA = new D;
B* pB = pA;
C* pC = pA;
pA->num(); //输出 2
pB->num(); //输出 2
pC->num(); //输出 2
原来多态会使用距离实体对象类型最近的虚函数,如果把D加上num(),那就很好理解了,会使用D的num()
在说说warning C4250:当使用菱形继承并且子类函数和了父类函数同名时会报错
struct base {
virtual int number() { return 0; }
};
struct weak : public virtual base {
void print() { // seems to only depend on base, but depends on dominant
std::cout << number() << std::endl;
}
};
struct dominant : public virtual base {
int number() { return 5; }
};
struct derived : public weak, public dominant {}
int main() {
weak w; w.print(); // 0
derived d; d.print(); // 5
}
但是我认为按照前面的顺序继承的说法,这个结果是对的啊,新建了一个
struct dominant2 :public dominant
{
int number(){return 6;}
};
让derived 继承 dominant2 ,结果输出6,个人认为这个就是前面顺序继承的原理,为什么要报错呢?
不知道会有什么隐患。