使用派生类成员函数访问基类的私有成员



我刚刚开始学习继承,我知道基类的私有成员不会被派生类继承。

但是,当我运行派生类的"get_data1"函数时,它会从基类返回data1的值,即使我在派生类中定义了一个新的"data1"。那么,它不是应该返回3而不是5吗,因为它是派生类的成员函数?

class base
{
int data1;
public:
base()
{
data1=5;
}
int get_data1()
{
return data1;
}
};
class derived : public base
{
int data1;
public:
derived()
{
data1=3;
}
void printData()
{
cout<<get_data1()<<endl;
}
};
int main()
{
derived der1;
der1.printData();
return 0;
}

我知道基类的私有成员不会被派生类继承。

否,private成员与其他成员一样继承。不同之处在于,与publicprotected成员不同,它们不能从派生类访问。


它是否应该返回3而不是5,因为它是派生类的成员函数?

不,您将调用printData与调用getdata1混淆了。即使printData是派生类成员函数,它也会调用基类的base::get_data1成员函数,该函数打印基类的数据成员,从而输出。

请参阅下面程序中添加的注释。

class base
{
int data1;
public:
base()
{
data1=5;
}
int get_data1()
{
return data1;  //this prints base class' data1's value
}
};
class derived : public base
{
int data1;
public:
derived()
{
data1=3;
}
void printData()
{
cout<<get_data1()<<endl; //this calls base class' base::get_data1()
}
};
int main()
{
derived der1;
der1.printData(); //this calls derived class' derived::printData()
return 0;
}

只需在基中创建额外的构造函数:

class base {
int data1;
public:
base()
: base(5)
{
}
explicit base(int initial)
: data1 { initial }
{
}
int get_data1() const
{
return data1;
}
};
class derived : public base {
public:
derived()
: base(3)
{
}
void printData()
{
std::cout << get_data1() << std::endl;
}
};

https://godbolt.org/z/aqxhTjTYa

最新更新