gpt4 book ai didi

c++ - 重新声明纯虚函数

转载 作者:行者123 更新时间:2023-12-01 14:36:42 28 4
gpt4 key购买 nike

我最近遇到了以下类型的代码:

struct A {
virtual void foo() = 0;
};

struct B : public A {
virtual void foo() = 0;
};

struct C : public B {
virtual void foo() override {
}
};
重新声明纯虚方法有什么目的吗?
更重要的是:这会改变语义吗?即是 B::foo阴影 A::foo并引入一个新的 vftable?
如果 A::foo 在上面的例子中会发生什么实际上不是纯虚拟的,而是提供了一个实现(仍然为我编译)?

最佳答案

查看来自 cppreference 的示例:

struct Abstract {
virtual void f() = 0; // pure virtual
}; // "Abstract" is abstract

struct Concrete : Abstract {
void f() override {} // non-pure virtual
virtual void g(); // non-pure virtual
}; // "Concrete" is non-abstract

struct Abstract2 : Concrete {
void g() override = 0; // pure virtual overrider
}; // "Abstract2" is abstract

int main()
{
// Abstract a; // Error: abstract class
Concrete b; // OK
Abstract& a = b; // OK to reference abstract base
a.f(); // virtual dispatch to Concrete::f()
// Abstract2 a2; // Error: abstract class (final overrider of g() is pure)
}

Is there any purpose in redeclaring a pure virtual method?


在派生类中将虚方法声明为纯方法是有目的的: Abstract2 can decalre g即使在 Concrete中不纯,也要纯虚.

Does this change semantics? I.e is B::foo shadowing A::foo and introducing a newvftable?


不。

Whats happens in the above example if A::foo is actually not pure virtual but provides an implementation (still compiles for me)?


请参阅示例。
您不必将方法声明为 virtual在派生类中。声明时 virtual在基地它也是 virtual在派生类中。简而言之, =0只是告诉编译器不一定有定义并且该类是抽象的。您的示例与以下示例相同:
struct AA {                       // abstract
virtual void foo() = 0;
};

struct BB : public AA { }; // abstract

struct CC : public BB { // concrete
void foo() override {}
};
我知道的唯一区别是 BB::foo 的类型:
// above
std::cout << std::is_same< decltype(&BB::foo), void (AA::*)()>::value;
std::cout << std::is_same< decltype(&BB::foo), void (BB::*)()>::value;
std::cout << std::is_same< decltype(&BB::foo), void (CC::*)()>::value << "\n";
// your example
std::cout << std::is_same< decltype(&B::foo), void (A::*)()>::value;
std::cout << std::is_same< decltype(&B::foo), void (B::*)()>::value;
std::cout << std::is_same< decltype(&B::foo), void (C::*)()>::value << "\n";
输出是:
100
010
即重新声明 fooB介绍名称 foo直接在 B . B::fooB 的成员函数.另一方面,在我的示例中 BB::foo是来自 AA 的方法.但是,这不会影响 C::foo .

关于c++ - 重新声明纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62636024/

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