gpt4 book ai didi

c++ - 简单继承后调用复制构造函数

转载 作者:行者123 更新时间:2023-11-30 01:25:57 26 4
gpt4 key购买 nike

我对继承的某些概念有疑问,我说的是我所知道的,如果我错了请指正。

基类的私有(private)成员由派生类继承,但派生类不能以任何方式访问它们。

基类的 protected 成员由派生类继承,但派生类不能直接访问它,而是借助于它的一些成员函数。

现在在下面的代码中:

class A
{
protected:
A(const A&){}
A operator=(const A &){}
int t;
public:
A(int r) {t=r;}
A(){t=0;}
};

class B : public A
{
A a;
public:
void make(void)
{
//A b(a); //LINE 1 -------COPY CONSTRUCTOR BEING CALLED ---protected member of base class
cout<<t; //LINE 2 -------protected member of base class
}
};

int main()
{
B b;
b.make();
return 0;
}

为什么 LINE 1 coming 出错了??

为什么我们不能为 A 的对象调用复制构造函数?

提前很多很多谢谢

最佳答案

protected 成员只能由同一完整对象的其他成员在构造、销毁期间或通过 this 访问指针(*)

在您的示例类层次结构中,一个 B对象有两个类型为 A 的子对象:

  • 基类子对象,它是从A 派生得到的, 和
  • 名为a的数据成员子对象,它通过声明 a 获得.

B 的成员只能从第一个 A 访问 protected 成员子对象,而不是第二个,因为只有第一个直接使用 this指针(请注意,您的表达式 cout << t 在语义上等同于 cout << this->t )。

访问成员数据成员不要直接使用this指针:如果您尝试访问 this->a.t来自 B::make , this指针不直接用于访问 t .在你的声明中 A b(a); ,复制构造函数不是为 this 调用的, 但对于新的 A您正在构建的对象,名为 b 的局部变量.


(*) 或者,当然,由声明它的类中的任何成员:B 的任何成员函数可以调用 B 的任何其他成员函数

关于c++ - 简单继承后调用复制构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11381141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com