我可以以某种方式在C++中创建一个与基类中的虚拟名称相同的新子类方法,但停止继承吗?
让我详细解释一下,请考虑以下代码:
#define L(m) std::cout << m << std::endl;
class A {
public:
virtual void func() { L("A::func"); };
virtual void func2() { L("A::func2"); };
};
class B: public A {
public:
void func() { L("B::func"); }; //implements A::func
void func2(){ L("B::func2"); }; //implements A::func2
};
class C: public A {
public:
void func2() { L("C::func2"); }; //implements A::func2
void func() { L("C::func"); }; //meant to declare a new function but accidentally overrides A::func
};
我不想在
func
中将A
声明为final(我知道它将停止继承,但对于B
类则需要这样做)。我也想用
C::func2
调用A
:C c;
A* a = &c;
a->func2(); //must use C::func2 (standard inheritance)
a->func(); //must use A::func !!! (possible?)
c.func2(); //must use C::func2
c.func(); //must use C::func
显然,我可以将C的
func
重命名为其他名称,但是无论如何,在不完全滥用C++规范的情况下是否可以实现?
最佳答案
试试这个 :
class C: public A {
public:
void func2() { L("C::func2"); };
void func(int i = 0) { L("C::func"); };
};
C::func
隐藏具有不同签名的A::func
。我得到了这个结果:C::func2
A::func
C::func2
C::func
而不是用您的代码:
C::func2
C::func
C::func2
C::func
关于c++ - 创建一个不继承自基类的新函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62424474/