第54课.被遗弃的多重继承(下)

1.多重继承的问题(三)

多重继承可能产生多个虚函数表

eg:

include

include

using namespace std;

class BaseA
{
public:
virtual void funcA ()
{
cout << "BaseA::funcA()" << endl;
}
};

class BaseB
{
public:
virtual void funcB ()
{
cout << "BaseB::funcB()" << endl;
}
};

class Derived : public BaseA, public BaseB
{

};

int main()
{
Derived d;

BaseA* pa = &d;
BaseB* pb = &d; // 指向同一对象的不同地方

BaseB* pbb = (BaseB*)pa; // 把pa指向到地址给到类pbb,此时pa指向到是BaseA

cout << "sizeof(d) = " << sizeof(d) << endl; // 8 证明类中有两个指向虚函数表到指针。也就是
// 说 多重继承产生类多个虚函数表
// 这也是子类和父类叠加的结果

cout << "Using pa to call funcA()..." << endl;
pa->funcA(); // 调用指针,指向虚函数表。在表中找到函数调用

cout << "Using pb to call funcB()..." << endl;
pb->funcB();

cout << endl;

cout << "Using pbb to call funcB()..." << endl;
pbb->funcB(); // 此时pbb调用的是pa的虚函数表。此表中只有
// funcA()函数。所以无法实现要求

return 0;
}

图解:

2.正确的使用多继承

单继承某个类 + 实现(多个)接口

eg:

include

include

using namespace std;

class Base
{
protected:
int mi;
public:
Base(int i)
{
mi = i;
}

int getI()
{
return mi;
}
};

class Interface1
{
public:
virtual void add(int i) = 0;
virtual void minus(int i) = 0;
};

class Interface2
{
public:
virtual void multiply(int i) = 0;
virtual void divide(int i) = 0;
};

class Derived : public Base, public Interface1, public Interface2
{
public:
Derived(int i) : Base(i)
{
}

void add(int i)
{
mi += i;
}
void minus(int i)
{
mi -= i;
}
void multiply(int i)
{
mi *= i;
}
void divide(int i)
{
if( i != 0 )
{
mi /= i;
}
}
};

int main()
{
Derived d(100);

return 0;
}

posted @ 2019-12-06 16:52  人民广场的二道贩子  阅读(256)  评论(0)    收藏  举报