【发布时间】:2018-10-27 02:11:09
【问题描述】:
有人告诉我,如果我在基类包含受保护的成员变量并且子类将构造基类时进行继承,它将在内存中复制它的成员。示例:
class Animal
{
public:
virtual std::string& sound() { return m_sound; }
virtual void setSound(std::string& sound) { m_sound = sound; }
virtual int age() { return m_age; }
virtual void setAge(int age) { m_age = age; }
protected:
Animal(std::string sound, int age) : m_sound(sound), m_age(age) { }
int m_age;
std::string m_sound;
};
class Dog : public Animal
{
public:
Dog(int speed) : Animal("Waff!!", 3), m_speed(speed) {}
virtual int speed() { return m_speed; }
virtual void setSpeed(int speed) { m_speed = speed; }
protected:
int m_speed;
};
所以使用上面的示例,换句话说,如果我创建一个Dog 对象,它将为 m_sound 和 m_age 分配 2 倍的内存。
这对我来说完全没有任何意义,我一直想知道为什么编译器会做这样的事情,除非我听到的信息具有误导性。
所以说我们主要创造:
Dog bulldog(5);
我想知道在父类数据和子类数据之间的问号所在的内存区域中究竟分配了什么。
【问题讨论】:
-
子类包含来自 all 基类的 all 成员,无论它们是
public、protected还是private。这些关键字仅供会员访问使用。 -
哪个编译器?什么平台?你究竟编译了什么代码?
-
你问带问号的区域是什么? sizeof(string) 是什么?
-
Someprogrammerdude 感谢您的确认。这正是我的想法。 einpoklum 这是我正在开发的跨平台库,所以基本上是任何编译器。 RetiredNinja 这也让我很好奇。
-
更明智地查看您的内存窗口:ideone.com/PWblN3
标签: c++ inheritance virtual-functions memory-layout