gpt4 book ai didi

c++ - 虚拟非方法成员

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:00 24 4
gpt4 key购买 nike

有类似的东西吗?这样就会产生错误。

class A {
public:
virtual std::string key;
};

class B : public A {
public:
std::string key;
};

int main()
{
A a;
a.key = "Foo";
return 1;
}

最佳答案

不,因为这真的没有意义。请记住,子类包含其父类的所有成员;因此,B 仍然有 Astd::string key。此外,由于 Bstd::string key 是同一类型,因此它绝对相同 A' s - 那么覆盖它的意义何在?

另外,请注意,在构造过程中,当我们运行A 的构造函数时,不会调用B 的虚方法。这意味着如果我们在 A 的构造期间访问 key,我们将获得 A 的 key - 但是当 B 被构建,key 将被隐藏,其数据完全不可访问。

也就是说,如果你真的想做这样的事情,出于某种原因,你需要使用虚拟访问函数:

class A {
private:
std::string m_key;
public:
virtual std::string &key() { return m_key; }
virtual const std::string &key() const { return m_key; }
};

class B : public A {
private:
std::string m_key;
public:
virtual std::string &key() { return m_key; }
virtual const std::string &key() const { return m_key; }
};

int main()
{
B b;
b.key() = "Foo";
return 0;
}

关于c++ - 虚拟非方法成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581508/

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