继承
继承模式:java和oc好像都没有这个概念,准确的说,java和oc中的继承都相当于c++的私有继承。
c++不愧是所有语言的爸爸
继承中构造函数的调用顺序
- 先调用父类构造函数
- 再调用子类构造函数
但是,所谓 儿子不能决定父亲的生死,子类无法继承父类的构造和析构函数。
class Animal{
private:
string name;
int age;
public:
Animal(string name,int age):name(name),age(age){};
};
class Dog:Animal{
Dog(string name,int age):
};
int main(){
Dog g("ggg",12);
}
子类调用构造函数时,默认是调用父类的无参构造函数(java也是一样,但java可以显示的调用其他构造函数,这个时候就不需要无参构造),如果父类没有无参构造函数,就会报错!!!,而且c++中没有super关键字。
构造函数的调用顺序:父类构造 -> 子类构造
但是,也可以指定调用父类的有参构造,毕竟我大c++无所不能
class Animal{
protected:
string name;
int age;
public:
Animal(){
cout << "no param construct" << endl;
};
Animal(string name,int age):name(name),age(age){
cout << "param construct" << endl;
};
};
class Dog:Animal{
private:
int speed;
public:
//显示调用父类的有参构造,和初始化成员列表分开
Dog(string name,int age,int speed):Animal(name,age),speed(speed){
cout << "child:speed " << speed << endl;
}
};
构造函数、析构函数、运算符重载=不能被继承
子类无法决定父类的生死
菱形继承问题和虚基类
class Animal{
public:
int age;
};
class Yan:virtual public Animal{};
class Tuo:virtual public Animal{};
class YanTuo:public Yan,public Tuo{};
int main(int argc, const char * argv[]) {
YanTuo yt;
yt.Tuo::age = 10;
yt.Yan::age = 20;
//如果不声明 Animal和虚继承,下面两句输出会是不同的值,声明后变成了同一个值
//虚基类内部实现暂时还不是特别理解,用法就是声明为虚基类的,只继承基类的一份拷贝
cout << yt.Yan::age << endl;
cout << yt.Tuo::age << endl;
return 0;
}