【发布时间】:2011-01-02 06:00:38
【问题描述】:
我知道派生类不能访问基类的私有成员,那为什么派生类要继承基类的私有成员呢?有没有有用的案例?
谢谢!
【问题讨论】:
-
你正在学习 C++ 的那本书对这个主题有什么要说的?
标签: c++
我知道派生类不能访问基类的私有成员,那为什么派生类要继承基类的私有成员呢?有没有有用的案例?
谢谢!
【问题讨论】:
标签: c++
派生类需要私有成员,即使它不能直接访问它们。否则,它的行为将不会建立在它所派生的类之上。
例如,假设私人的东西是:
int i;
并且该类有 geti() 和 seti()。 i 的值必须放在某个地方,即使它是私有的,
【讨论】:
基类的public和protected方法仍然可以访问基类的private变量,这些方法在派生类中可用。
【讨论】:
基类仍然可以使用私有成员变量和方法。
如果您希望派生类能够访问成员但不让这些成员对外界隐藏,请将它们设为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;
}
};
【讨论】:
不要忘记基类可能有不是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
}
};
【讨论】:
原因是派生类与超类有is-a 关系。
派生类实例化是超类实例化...只是有更多(或更少由于将某些超类函数设置为私有)的东西。
【讨论】:
private 变量,无论它是否允许派生类直接使用它们。
正如此处其他答案所述,派生类在语法上无法访问基类的私有成员;但它需要在其内存布局中具有相同的副本。想想铸造。使用“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();
【讨论】:
派生类不会以任何方式“继承”基类的私有成员 - 它无法访问它们,因此不会“继承”它们。
派生类的实例包含基类的私有成员的实例,原因很明显。
所以我什至不知道你这个问题是什么意思。
【讨论】:
在创建派生类对象时,还会调用基类构造函数来创建基类对象。如果基类的私有成员没有分配内存,则基对象将是不完整的。
因此派生类对象继承基类的私有成员,因为它们是在创建基类对象期间创建的,但由于它们是私有的,所以不可访问。
【讨论】:
虽然私有成员不能从基类访问,但它们被基类继承,因为派生类在非私有函数的帮助下使用这些属性。
基类的私有成员不是直接访问的,而是由基类逐个派生的。
【讨论】: