版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hhhuang1991/article/details/80177596
一、 子类能够从父类继承哪些内容?
除了父类的构造函数和析构函数外,其余public和protected作用域的成员都能被子类继承:
- 子类不能从父类继承的有:普通构造函数、拷贝构造函数、析构函数;
- 子类能够从父类继承的有:静态成员变量、静态成员函数、友元函数、赋值操作符重载函数。
二、关于静态成员的几个问题
1. 子类如何调用父类的静态成员?
父类名::成员
子类名:成员
子对象.成员
子对象指针->成员
2. 父子类中是否能够存在相同名称的静态成员?
可以。可以使用各自的类名或对象名或对象指针调用对应的静态成员。
3. 类静态成员解读
实质上,类静态成员就是带有类作用域的全局成员。因为父子类拥有部分相同的作用域,因此可以继承。
三、子类拷贝构造函数如何调用父类拷贝构造函数?
请看下面一段代码:
class Base
{
public:
Base()
{
cout << "Base Constructor. \n";
}
~Base() {
cout << "Base Destructor. \n";
}
Base(const Base& other)
{
cout << "Base Copy Constructor. \n";
}
};
class Drived : public Base
{
public:
Drived()
{
cout << "Drived Constructor. \n";
}
~Drived()
{
cout << "Drived Destructor. \n";
}
Drived(const Drived& other)
{
cout << "Derived Copy Constructor. \n";
}
};
int main()
{
Drived d1; //调用Base和Drived构造函数
Drived d2 = d1; //调用Base构造函数和Drived拷贝构造函数
return 0;
}
运行结果:
Base Constructor.
Drived Constructor.
Base Constructor.
Derived Copy Constructor.
Drived Destructor.
Base Destructor.
Drived Destructor.
Base Destructor.
解读:
1、 当执行Drived d2 = d1;
时,很明显可以看出,会调用Drived的拷贝构造函数,此拷贝函数会拷贝Drived类的所有内容,但是不会拷贝父类Base中的内容。因此,编译器还是会调用父类的默认构造器去构建父类中的内容;
2、 为了避免Drived的拷贝构造函数调用的是Base的拷贝构造函数,而不是Base的默认构造函数,需要在成员初始化列表中,调用Base的拷贝构造函数:
Drived(const Drived& other):
Base(other)
{
cout << "Derived Copy Constructor. \n";
}