【发布时间】:2021-04-22 18:17:29
【问题描述】:
我想隐藏一个基类的虚函数,并引入一个具有相同名称和相同签名的新虚函数,但返回类型除外。
类似:
struct A {
virtual int f() = 0; // Newly introduced method: A::f.
};
struct B: public A {
int f() final { return 1; } // Overriding A::f.
};
struct C: public B {
virtual double f() = 0; // Newly introduced method C::f. It shadows A::f
};
struct D: public C {
double f() final { return 2.0; } // Overriding C::f.
};
我希望它的行为方式如下:
D d;
ASSERT( static_cast<D&>(d).f() == 2.0 );
ASSERT( static_cast<C&>(d).f() == 2.0 );
ASSERT( static_cast<B&>(d).f() == 1 );
ASSERT( static_cast<A&>(d).f() == 1 );
有可能实现吗?
任何版本的 C++ 标准都可以。
【问题讨论】:
-
一般来说,你不能拥有具有相同签名和不同返回类型的函数。
-
如果您将
A::f函数设为模板,然后将其专门用于子类B和D,也许它会起作用?这取决于用例和您需要解决的实际问题(请始终直接询问)。 -
@Someprogrammerdude 但是即使从模板生成,如果两个函数声明仅在返回类型上有所不同,它将不起作用。
标签: c++ inheritance overriding overloading virtual-functions