现在的位置: 首页 > 综合 > 正文

继承虚函数

2014年03月13日 ⁄ 综合 ⁄ 共 831字 ⁄ 字号 评论关闭

遇到遇到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,个人认为这个就是前面顺序继承的原理,为什么要报错呢?
不知道会有什么隐患。

抱歉!评论已关闭.