本文共 1478 字,大约阅读时间需要 4 分钟。
工程上的多继承
被实际开发经验抛弃的多继承
工程开发中真正意义上的多继承是几乎不被使用的
多重继承带来的代码复杂性远多于其带来的便利
多重继承对代码维护性上的影响是灾难性的
在设计方法上,任何多继承都可以用单继承代替
多继承中的二义性和多继承不能解决的问题
C++中是否有Java中的接口概念? |
绝大多数面向对象语言都不支持多继承 绝大多数面向对象语言都支持接口的概念 C++中没有接口的概念 C++中可以使用纯虚函数实现接口 接口类中只有函数原型定义,没有任何数据的定义。 class Interface { public: virtual void func1() = 0; virtual void func2(int i) = 0; virtual void func3(int i) = 0; }; |
实际工程经验证明 多重继承接口不会带来二义性和复杂性等问题 多重继承可以通过精心设计用单继承和接口来代替 接口类只是一个功能说明,而不是功能实现。 子类需要根据功能说明定义功能实现。 |
代码如下:
#includeusing namespace std;/**c++中没有接口的概念,但是c++中可以通过纯虚函数来定义一个接口,接口只是功能的说明,并没有功能的实现,用接口可以解决多继承中的二义性c++中多继承的问题完全可以通过单继承和接口实现,避免出现二义性的问题。*/class Interface1 //用纯虚函数来实现接口{public: virtual int add(int a, int b) = 0; virtual void print() = 0;};class Interface2 //让纯虚函数来实现接口{public: virtual int mult(int a, int b) = 0; virtual void print() = 0;};class Parent{public: virtual int getA() { a = 0; return a; }protected:private: int a;};class Child : public Parent, public Interface1, public Interface2{public: virtual int add(int a, int b) { cout << "Child: add()已经执行\n"; return a + b; } virtual void print() { cout << "Child: print()已经执行\n"; } virtual int mult(int a, int b) { cout << "Child: mult()已经执行\n"; return a * b; } virtual int getA() { cout << "我是孩子" << endl; return 0; }protected:private:};void main(){ Child c1; c1.print(); Parent* p = &c1; p->getA(); Interface1* it1 = &c1; it1->add(1, 2); Interface2* it2 = &c1; it2->mult(3, 6); cout << "hello..." << endl; system("pause"); return;}
转载地址:http://qrzmi.baihongyu.com/