目录
C++中没有Java中的接口概念,抽象类可以模拟Java中的接口类。(接口和协议)
工程上的多继承
被实际开发经验抛弃的多继承
工程开发中真正意义上的多继承是几乎不被使用的
多重继承带来的代码复杂性远多于其带来的便利
多重继承对代码维护性上的影响是灾难性的
在设计方法上,任何多继承都可以用单继承代替
举例说明
下面所举的例子就是多继承使用的规范场景:
先定义一个抽象类:
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:
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;
}
protected:
private:
};
在主函中调用:
void main71()
{
Child c1;
c1.print();
Interface1 *it1 = &c1;
it1->add(1, 2);
Interface2 *it2 = &c1;
it2->mult(3, 6);
cout<<"hello..."<<endl;
system("pause");
return ;
}
实际工程经验证明
多重继承接口不会带来二义性和复杂性等问题
多重继承可以通过精心设计用单继承和接口来代替
接口类只是一个功能说明,而不是功能实现。
子类需要根据功能说明定义功能实现。
总体代码
dm07_抽象类在多继承中的应用.cpp
#include <iostream>
using namespace std;
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:
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;
}
protected:
private:
};
void main71()
{
Child c1;
c1.print();
Interface1 *it1 = &c1;
it1->add(1, 2);
Interface2 *it2 = &c1;
it2->mult(3, 6);
cout<<"hello..."<<endl;
system("pause");
return ;
}