C++允许一个类从一个或多个基类派生 如果一个类只有一个基类,称为单一继承。如果一个类具有两个或两个以上的基类,就称为多重继承 class 派生类名:继承方式 基类名1 , 继承方式 基类名2 ,. . . { } ;
# include <iostream> using namespace std; class Phone { private : string m_number; public : Phone ( const string& number) { m_number= number; } void call ( const string& number) { cout<< m_number<< "打给: " << number<< endl; } } ; class Player { public : Player ( const string& media) { m_media= media; } void play ( const string& music) { cout<< m_media<< "正在播放: " << music<< endl; } private : string m_media; //播放器的名称 } ; class Computer { private : string m_os; //使用的操作系统 public : Computer ( const string& os) : m_os ( os) { } void run ( const string& app) { cout<< "在" << m_os<< "正在运行: " << app<< endl; } } ; /*典型的多重继承*/ class SmartPhone : public Phone , public Player , public Computer { public : SmartPhone ( const string& number, const string& media, const string& os) : Phone ( number) , Player ( media) , Computer ( os) { } } ; int main ( void ) { SmartPhonehuawei ( "13988888888" , "MP4" , "鸿蒙" ) ; huawei. call ( "010-12345" ) ; huawei. play ( "我和我的祖国" ) ; huawei. run ( "王者荣耀" ) ; return 0 ; } 名字冲突 当两个不同基类拥有同名成员时,容易产生名字冲突问题 使用域限定符解决 # include <iostream> using namespace std; class A { public : void func ( void ) { cout<< "A::func()" << endl; } } ; class B { public : void func ( void ) { cout<< "B::func()" << endl; } } ; class C : public A , public B { } ; int main ( void ) { C test; test. A :: func ( ) ; return 0 ; } 钻石继承(菱形继承)与虚继承 钻石继承,一个派生类继承的多个基类又源自一个公共的祖先(公共基类)
# include <iostream> using namespace std; class A { protected : int m_data; public : A ( int data) { m_data= data; cout<< "A(int)" << endl; } } ; class B : public A { public : B ( int data) : A ( data) { cout<< "B(int)" << endl; } void set ( int data) { m_data= data; } } ; class C : public A { public : C ( int data) : A ( data) { cout<< "C(int)" << endl; } int get ( void ) { return m_data; } } ; class D : public B , public C { public : D ( int data) : B ( data) , C ( data) { cout<< "D(int)" << endl; } } ; int main ( void ) { Dd ( 100 ) ; cout<< sizeof ( d) << endl; cout<< d. get ( ) << endl; // 100 d. set ( 200 ) ; cout<< d. get ( ) << endl; //100 return 0 ; } 以上set(200)后还是100 解决方式:虚继承 虚继承语法:在继承表使用virtual关键字修饰 位于继承链末端子类负责构造公共基类子对象
# include <iostream> using namespace std; class A { protected : int m_data; public : A ( int data) { m_data= data; cout<< "A(int)" << endl; } } ; class B : virtual public A { public : B ( int data) : A ( data) { cout<< "B(int)" << endl; } void set ( int data) { m_data= data; } } ; class C : virtual public A { public : C ( int data) : A ( data) { cout<< "C(int)" << endl; } int get ( void ) { return m_data; } } ; class D : public B , public C { public : D ( int data) : B ( data) , C ( data) , A ( data) { cout<< "D(int)" << endl; } } ; int main ( void ) { Dd ( 100 ) ; cout<< sizeof ( d) << endl; cout<< d. get ( ) << endl; // 100 d. set ( 200 ) ; cout<< d. get ( ) << endl; //200 return 0 ; }