如何解决具有相同字段名称的派生结构
我有两个结构体 pins1_t
和 pins2_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 :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。