gpt4 book ai didi

c++ - C++获取子类成员的方法

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:54 25 4
gpt4 key购买 nike

例如我有两个类(class)

A 类:

class A
{
private:
int a;

}

B 类:

class B: private A
{
private:
char b;

public:
char getB();
}

代码:

int main()
{
A* item = new B();
char b = (B)item->getB();
}

如果我需要做类似的事情,我应该使用 cast 还是应该重新设计程序?我不想使用多态性。

最佳答案

问题

1) B 私有(private)继承自 A。因此只有 B 可以将 B* 转换为 A*

2) 你的表达式的优先级与 (B)(item->getB()); 所以这不会编译因为 item 是一个 A 并且 A 没有成员 getB()

3) 最好使用static_castdynamic_cast 而不是旧的C 风格转换。

解决方案

1) 如果您想在类本身之外的派生类和基类之间进行转换,请使用公共(public)继承。

2) 然后使用括号:

char b = ((B*)item)->getB();

3) 或者更喜欢更精确的形式:

char b = static_cast<B*>(item)->getB();

4) 但是,当您像这样进行沮丧时,后果自负。如果 A* 指针指向除 B 或从 B 派生的类之外的其他内容,则它是未定义的行为。

当你考虑对你的类型进行多态使用时,你最好有一个虚拟析构函数,这样你就可以用适当的析构函数删除项目(在这里它会使用 A 的析构函数而不是 B 的析构函数)。

只要你有至少一个虚函数,你就可以使用更安全的 dynamic_cast:

 if(dynamic_cast<B*>(item)) {  // would be nullptr if item doesn't point to a B object
char b = dynamic_cast<B*>(item)->getB();
... // further processing of the char
}
else cout << "Ooops!"<<endl;

关于c++ - C++获取子类成员的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32170274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com