C++父子类中关于继承的一些问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 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";
    }

猜你喜欢

转载自blog.csdn.net/hhhuang1991/article/details/80177596