一 继承的语法
继承语法的基本格式为:子类:继承方式 父类
#include<iostream>
using namespace std;
class Animal {
public:
Animal() {
cout << "吃" << endl;
}
};
class Dog : public Animal {
public :
void say() {
cout << "汪汪汪" << endl;
}
};
int main() {
Dog dog;
dog.say();
return 0;
}
运行结果如下:
二 继承方式
继承方式有public, protected, private三种
子类的继承方式与父类中访问权限的作用域共同决定了子类中父类成员的访问权限:
/*
* |public |protected |private 父类访问权限
* public |public |protected |无法访问
* protected |protected |protected |无法访问
* private |private |private |无法访问
子类继承方式
*/
继承方式为public不会对父类的访问权限产生任何影响,子类中该成员的访问权限与父类一致
而其它的只能把比自己宽松的权限改为自己,比如,protected比public严格,那么子类protected继承父类则父类中访问权限为public的成员在子类中一律变为protected,而不能将private的成员改为protected。比自己更严格的保持不变。
三 构造与析构的顺序
#include<iostream>
using namespace std;
class Animal {
public:
Animal() {
cout << "Animal构造" << endl;
}
~Animal() {
cout << "Animal析构" << endl;
}
};
class Dog : public Animal {
public :
Dog() {
cout << "Dog构造" << endl;
}
~Dog() {
cout << "Dog析构" << endl;
}
void say() {
cout << "汪汪汪" << endl;
}
};
int main() {
Dog dog;
return 0;
}
运行结果如下:
大家不难发现,构造析构的顺序类似于栈,先构造的后析构。
a-->b-->c-->d,d继承c,c继承b,b继承a,则顺序为:abcd(构造) dcba(析构) 顺序从中往右。
四 同名属性的访问
要是子类和父类的属性名称相同会怎么样呢?大家请看代码:
#include<iostream>
using namespace std;
class Animal {
public:
Animal() {
m_Data = 1;
}
int m_Data;
};
class Dog : public Animal {
public :
Dog() {
m_Data = 2;
}
int m_Data;
};
void Test() {
Dog d;
cout << d.m_Data << endl;
cout << d.Animal::m_Data << endl;
cout << &(d.m_Data) << endl;
cout << &(d.Animal::m_Data) << endl;
}
int main() {
Test();
return 0;
}
运行结果如下:
不难发现子类中的属性与父类的同名属性地址不同不是同一个变量,互不影响。
五 同名方法的访问
其实同名方法的访问与同名属性的访问大同小异,大家可以类比理解:
#include<iostream>
using namespace std;
class Animal {
public:
void eat() {
cout << "Animal eat" << endl;
}
};
class Dog : public Animal {
public :
void eat() {
cout << "Dog eat" << endl;
}
};
void Test() {
Dog d;
d.eat();
d.Animal::eat();
}
int main() {
Test();
return 0;
}
运行结果如下:
六 多继承
多继承,顾名思义就是一个类继承了多个父类,
#include<iostream>
using namespace std;
class BaseA {
public:
int BaseA;
int m_Base;
};
class BaseB {
public:
int BaseB;
int m_Base;
};
class BaseC {
public:
int BaseC;
int m_Base;
};
class Son :public BaseA, public BaseB, public BaseC {
};
int main() {
Son s;
s.BaseA = 1;
s.BaseB = 2;
s.BaseC = 3;
s.m_Base = 4;
return 0;
}
下面的代码才正确:
#include<iostream>
using namespace std;
class BaseA {
public:
int BaseA;
int m_Base;
};
class BaseB {
public:
int BaseB;
int m_Base;
};
class BaseC {
public:
int BaseC;
int m_Base;
};
class Son :public BaseA, public BaseB, public BaseC {
};
int main() {
Son s;
s.BaseA = 1;
s.BaseB = 2;
s.BaseC = 3;
s.BaseA::m_Base = 4;
s.BaseB::m_Base = 5;
s.BaseC::m_Base = 6;
return 0;
}
再试一下:
#include<iostream>
using namespace std;
class BaseA {
public:
int BaseA;
int m_Base;
};
class BaseB {
public:
int BaseB;
int m_Base;
};
class BaseC {
public:
int BaseC;
int m_Base;
};
class Son :public BaseA, public BaseB, public BaseC {
};
int main() {
Son s;
s.BaseA = 1;
s.BaseB = 2;
s.BaseC = 3;
s.BaseA::m_Base = 4;
s.BaseB::m_Base = 5;
s.BaseC::m_Base = 6;
cout << &(s.BaseA::m_Base) << endl;
cout << &(s.BaseB::m_Base) << endl;
cout << &(s.BaseC::m_Base) << endl;
return 0;
}
运行结果如下:
好了,以上就是C++继承的主要内容,本文就讲到这里,希望大家多多支持!