我知道派生类无法访问基类的私有成员,为什么派生类会继承基类的私有成员?有什么情况它有用吗?
谢谢!
答案 0 :(得分:23)
派生类需要私有成员,即使它不能直接访问它们。否则它的行为不会建立在它派生的类上。
例如,假装私人内容是:
int i;
并且该类具有geti()和seti()。 i的值必须放在某处,即使它是私有的,
答案 1 :(得分:10)
基类的public和protected方法仍然可以访问基类的私有变量,这些方法在派生类中可用。
答案 2 :(得分:4)
基类仍然可以使用私有成员变量&方法
如果您希望派生类可以访问成员但是让这些成员对外部世界隐藏,请将它们protected:
。
以下是一个例子来说明:
class Base
{
public:
Base() : val(42.0f) {};
float GetValue() const
{
return val_;
}
private:
float val_;
};
class Derived : public Base
{
public:
float ComputedValue() const
{
return GetValue() * 2.0f;
}
};
答案 3 :(得分:4)
不要忘记基类可能具有非private
的方法,因此派生类可以访问它们。那些protected
或public
基类方法仍然可以调用private
基类方法。如果要锁定基类中的核心功能(例如使用Template Method设计模式实现),这将特别有用:
class base
{
public:
virtual ~base() { /* ... */ }
virtual void base_func() { foo_private (); }
virtual void do_func() = 0;
private:
void foo_private()
{
// pre-do_func() operations
do_func();
// post-do_function operations
}
};
class derived : public base
{
public:
void derived_func() { base_func(); }
virtual void do_func()
{
// Derived class specific operations
}
};
答案 4 :(得分:2)
原因是派生类与超类之间存在is-a
关系。
派生类实例化是一个超类实例化...只是有更多(或更少,因为设置一些超类函数私有)的东西。
答案 5 :(得分:2)
正如其他答案所述,派生类在语法上无法访问基类的私有成员;但它需要在其内存布局中有相同的副本。想想铸造。使用'C'投射,您可以将派生到某个私人基地。然后编译器需要正确的内存偏移量,以便为基础对象生成有效的内存布局。
实施例。
class Base {
public:
void printA() {
a = 10;
std::cout << a << std::endl;
}
private:
int a;
};
class Derived : private Base{
int b;
};
Derived* d = new Derived;
Base* b = (Base*)d;
b->printA();
答案 6 :(得分:0)
派生类不会以任何方式“继承”基类的私有成员 - 它无法访问它们,因此它不会“继承”它们。
派生类的实例包含基类私有成员的实例,原因很明显。
所以我甚至不知道你的意思是什么。
答案 7 :(得分:0)
创建派生类对象时,还会调用基类构造函数来创建基础对象。如果没有为基类的私有成员分配内存,则基础对象将不完整。
因此,派生类对象继承了base的私有成员,因为它们是在创建基类对象期间创建的,但由于它们是私有的,因此无法访问。
答案 8 :(得分:0)
虽然私有成员不能从基类访问,但它们是由它们继承的,因为派生类在非私有函数的帮助下使用这些属性。
基类的私有成员不是直接访问的,而是由派生类的基类派生的。