1、继承的基本用法
说明:类的继承就是新的类获取了旧类的特性。反过来,旧类将特性赋予新类就是类的派生。
这里的旧类常被称为基类。
新类继承格式:
class 新类名:public 基类名
#include <iostream>
#include <string>
using namespace std;
class compute
{
public:
int add(int a, int b)
{
return a + b;
}
private:
string say()
{
return "hahaha";
}
};
class complx_compute:public compute
{
public:
int add(int x, int y, int z)
{
return x + y + z;
}
int substract(int a, int b)
{
return a - b;
}
};
int main()
{
complx_compute com1;
cout << com1.add(4, 6, 9) << endl;
}
能完成的功能:
1、补充新的数据成员和成员函数。
2、修改基类中的成员和成员函数定义。
3、改变基类成员在派生类中的访问属性。
2、继承方式
public继承:子类中基类的public、protected、private分区保持不变、但子类中无法访问基类的private分区。
protected继承:子类中基类的public变成protected,protected、private分区保持不变、但子类中无法访问基类的private分区。
private继承:子类中基类的public、protected均变成private,private分区保持不变、但子类中无法访问基类的private分区。
基类的 | public区 | protected区 | private区 |
public继承 | 沿用 | 沿用 | 沿用 |
protected继承 | 变成protected | 沿用 | 沿用 |
private继承 | 变成private | 变成private | 沿用 |
cmd查看类结构方法:
示例:
class Human {
public:
void body() {
cout << "human have two legs and arms" << endl;
}
};
class Tom :public Human {
public:
void money() {
cout << "He's family has 100million dollars." << endl;
}
protected:
void hobhy() {
cout << "He'd like to fishing rather than walking." << endl;
}
private:
void secrete() {
cout << "Tom is actually a police." << endl;
}
};
class Tom_son1 :public Tom {
private:
void secrete() {
cout << "Tom_son1 like his neighbor Alley." << endl;
}
};
class Tom_son2 :protected Tom {
private:
void secrete() {
cout << "Tom_son2 like his neighbor Alley too." << endl;
}
};
class Tom_son3 :private Tom {
private:
void secrete() {
cout << "Tom_son3 are alone." << endl;
}
};
int main() {
Tom tom;
tom.money();
Tom_son1 t1;
t1.money();
//这两个类分别使用protected、private继承方式,把基类的public转换成立protected和private,均不能通过对象访问了。
Tom_son2 t2;
Tom_son3 t3;
system("pause");
return 0;
}
3、继承中的重名变量和函数
3.1 注意点
a、对于子类对象,当调用子类与基类均存在的同名变量或函数时,会优先调用子类中的成员变量或函数,如果要调用基类中的同名变量或函数,需要在子类对象后加上基类作用域来调用。
b、当重名函数在基类中有重载时,子类对象不能直接调用基类中被重载的函数,需要在子类对象后加上基类作用域来调用。
c、对于静态成员变量和静态成员函数同样适用。
3.2 示例
class Base {
public:
int m_A = 100;
void func() {
cout << "Base func" << endl;
}
void func(int) {
cout << "Base func2" << endl;
}
};
class Son :public Base {
public:
int m_A = 200;
void func() {
cout << "Son func" << endl;
}
};
int main() {
Son son1;
son1.m_A;
cout << son1.m_A << endl;
son1.func();
cout << son1.Base::m_A << endl;
son1.Base::func();
son1.Base::func(1);
system("pause");
return 0;
}
4、虚继承(虚基类)
4.1 定义
在继承方法前加 virtual 关键字的继承方法,被称为虚继承
class Newclass : virtual public Baseclass{}
4.2 作用
当使用多继承方法时,子类继承的基类1与基类2可能含有相同的成员变量,而子类只需要一个,如果使用简单的多继承方式,会导致大量的资源浪费,因此采用虚继承来解决。
示例:(53条消息) c++虚基类_lucust的博客-CSDN博客
class Base {
public:
int m_A = 100;
};
class Son1 :virtual public Base {
};
class Son2 :virtual public Base {
};
class Grandson1 : public Son1, public Son2 {
};
int main() {
Grandson1 gd1;
gd1.Son1::m_A = 20;
cout << gd1.Son1::m_A << endl;
gd1.Son2::m_A = 40;
cout << gd1.Son2::m_A << endl;
gd1.m_A = 200;
cout << "--------" << endl;
cout << gd1.Son1::m_A << endl;
cout << gd1.Son2::m_A << endl;
cout << gd1.m_A << endl;
system("pause");
return 0;
}
结果: