gpt4 book ai didi

c++ - 为什么在缺少非 const 虚方法时不能实例化类的 const 实例?

转载 作者:太空宇宙 更新时间:2023-11-04 14:36:15 25 4
gpt4 key购买 nike

为什么这不合法?

class Base {
public:
virtual void bar() = 0;
virtual void barc() const = 0;
};

class Derived: public Base {
public:
// deliberately omitted
// virtual void bar()
virtual void barc() const override { };
};

int main() {
const Derived b;
b.barc();
// b.bar();
// fails as expected with "passing 'const Bar' as 'this' argument discards qualifiers"
}

这失败并出现以下错误,因为我没有定义 virtual void bar():

prog.cpp: In function 'int main()':
prog.cpp:16:12: error: cannot declare variable 'd' to be of abstract type 'Derived'
const Derived d;
^
prog.cpp:10:7: note: because the following virtual functions are pure within 'Derived':
class Derived : public Base{
^
prog.cpp:6:15: note: virtual void Base::bar()
virtual void bar() = 0;

但是无论如何我都不能在这里调用bar,因为那个方法没有被标记为const。如果定义了 bar,是否有任何合法的方式来间接调用 d.bar()

  • 是否允许使用 const_cast

  • 我会在转换父类(super class)/子类时遇到麻烦吗?

如果不是,那我为什么要定义它?

最佳答案

我认为有一些直截了当的方式可以表达这一点:

  1. 因为只有一个vtable。 const 和非常量对象共享它。

  2. 因为您可能会将 const 对象const_cast 为非常量对象。

  3. 因为在构造对象时,它不是const。

  4. 因为常量不是对象本身的属性,它是附加到对象或引用的属性,限制了对对象部分的访问。

进一步的问题是:

Is using a const_cast allowed?

是的。但是你对 const_casted 引用所做的事情会很快导致“未定义的行为”。这并不意味着“世界末日”,正如某些人希望您相信的那样。它的意思是,“c++ 标准没有定义这种行为——如果编译器、硬件或操作系统愿意,那取决于他们”。也就是说,无论您对 const_casted 引用做什么,都不太可能是可移植的。

Can I get in trouble with casting a super/subclass?

转换是对麻烦的公开邀请。

关于c++ - 为什么在缺少非 const 虚方法时不能实例化类的 const 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306284/

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