c++ - 在C++中,是否为派生类创建了一组新的私有(private)变量?

标签 c++ class inheritance

这可能是个愚蠢的问题,但我整天都在思考这个问题。派生类创建时,是不是使用基类的public成员作用于自己的私有(private)变量?为了更好地解释这一点,我在下面编写了一个快速程序

#include <iostream>
#include <string>

class person
{
public:
    std::string getname(void) { return name; }
    void setname(std::string x) { name = x; }
private:
    std::string name;
    int age;

};

class doubleperson :public person{};

int main()
{
    person a, b;
    doubleperson c;
    a.setname("bob");
    b.setname("jon");
    c.setname("jim");

    std::cout << a.getname() << std::endl;
    std::cout << b.getname() << std::endl;
    std::cout << c.getname() << std::endl;

    std::cout << &c.getname() << std::endl;
    std::cout << &a.getname() << std::endl;
    std::cout << &b.getname() << std::endl;

    std::cin.get();

当我运行这段代码时,我得到了

bob
jon
jim
0032F904
0032F8E0
0032F8BC

这告诉我“name”变量有三个独立的实例。当我创建一个基类时,c.setname 是在 person 类还是 double person 类中使用 setname,它如何知道对派生类而不是基类的“名称”进行操作?

最佳答案

您将访问权限与构建类实例混淆了。

当你声明一个类时,你就是在定义一个新类型的结构。这可以包括成员变量(和函数等),并且每次将类创建为对象时都会创建这些变量。例如,如果您为 Person 类创建了 3 个不同的变量,那么对于类定义中声明的每个成员变量,每个变量都有自己不同的内存。这也有异常(exception),例如静态成员变量,但通常类的每个实例都会为其每个成员变量拥有自己的内存空间。

创建子类只是有效地将现有类扩展为可以包含新成员变量(以及其他相关因素)的新类型。父类的原始内存定义仍然包含在子类中。在这种情况下,您的 doubleperson 类包含与父 person 类相同的信息,即每个 doubleperson 类现在都有一个名为“name”的成员变量。因此,当您创建每个 doubleperson 类的实例时,您会在内存中为该成员变量名称和 doubleperson 类的其他部分创建一个不同的位置。这当然是您在每个实例中看到不同内存位置的原因。如果您在 person 类中将成员变量名称声明为静态,这将使一个变量在 doubleperson(和 person,就此而言)的所有实例之间共享,然后您将看到每个 doubleperson 实例具有相同的内存位置成员变量名。

这也意味着成员变量的访问权限并不能反射(reflect)它们在类定义中的存储方式。 Access 只是定义了您可以在类层次结构中的哪个级别访问特定的成员变量。这里,name 变量可以在 person 类的函数中访问,但不能在 doubleperson 子类中访问。但是,无论何时创建 doubleperson 类的实例,都会在它自己独特的内存空间中携带 person 类的定义。要跨实例修改特定成员变量在内存中的存储方式,您需要查看“static”等关键字或其他编程模式来实现此类功能。

关于c++ - 在C++中,是否为派生类创建了一组新的私有(private)变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48687542/

相关文章:

javascript - 如何使用 jQuery 将重复的类添加到 DOM 对象?

c++ - 类初始值设定项检查特定输入

java - 从子类获取数据: Java

c++ - 纯虚函数和 "cannot allocate an object"

c++ - 如何将函数应用于可变列表的每个组件并返回可变列表?

java - 使用泛型方法返回类型、列表

java - 通过返回字符串的 JNI 从 C++ 调用 java 函数

css - 如何在 CSS 中继承类值

c++ - 无参数的 std::thread 构造函数

c++ - 将文本文件转换为二进制流?