具有相同字段名称的派生结构

问题描述

我有两个结构体 pins1_tpins2_t,它们的字段名称相同但值不同。 pins2_t 源自 pins1_t

namespace pins {
    struct pins1_t {
        int A = 1;
        int B = 2;
        int C = 3;
        int D = 4;
    };

    struct pins2_t : pins1_t {
        int A = 6;
        int B = 7;
        int C = 8;
        int D = 9;
    };
};

我试图通过基结构引用来访问 pins2_t 中的值,但没有成功。

pins::pins1_t pins1;
pins::pins2_t pins2;

pins::pins1_t* pPins;
pins::pins1_t* pPins2;

pPins = &pins1;
pPins2 = &pins2;

print("Pins %d,Pins2 %d,PPins %d,PPins2 %d",pins1.A,pins2.A,pPins->A,pPins2->A);
The output is: "Pins 1,Pins2 6,PPins 1,PPins2 1"
But should be: "Pins 1,PPins2 6"

即使我尝试pins::pins2_t* pPins2,所以我用派生类引用派生类指针,我得到基类的值:/

解决方法

派生类中的成员会影响基类中的成员。这几乎从来都不是您想要的(因为,正如您所注意到的,它行不通)。

因为无论如何这些都只是变量,所以没有必要隐藏子类中的声明。只需初始化基类成员:

struct pins1_t {
    int A = 1;
    int B = 2;
    int C = 3;
    int D = 4;
};

struct pins2_t : pins1_t {
    pins2_t() : pins1_t{6,7,8,9} {}
};

(或者,您可以按照 interjay 的建议通过虚函数使用运行时多态性,但目前您的问题中没有任何内容表明这是必要的;并且在没有令人信服的理由的情况下,它是过度设计的。)

,

我正在尝试通过基础结构引用来访问 pin2_t 中的值

您只能通过基础子对象访问基础子对象的成员。您不能访问派生类的成员。因此,您无法实现您想要做的事情。

,

看来您需要仔细检查您的解决方案。至少这部分:

即使我尝试pins::pins2_t* pPins2,所以我用派生类引用派生类指针,我得到基类的值:/

此代码适用于我(Mac OS,g++ 4.2.1 编译器):

  pins1_t pins1;
  pins2_t pins2;

  pins1_t* pPins;
  pins2_t* pPins2; // <-- pointer type fixed here

  pPins = &pins1;
  pPins2 = &pins2;

  printf("Pins %d,Pins2 %d,PPins %d,PPins2 %d",pins1.A,pins2.A,pPins->A,pPins2->A);

输出与您在“应该”部分中所写的相同:

  Pins 1,Pins2 6,PPins 1,PPins2 6

最简单的方法是使用 dynamic_cast。但是您需要至少定义一个虚函数才能以这种方式工作。见C++ inheritance downcasting

另一方面,为了使用指向基类的指针而不使用标准的 dynamic_cast 方式访问派生类字段,可以使用 static_cast 甚至 reinterpret_cast。但这似乎是一个肮脏的黑客。除非您知道自己在做什么,否则不要使用 reinterpret_cast :)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...