c++ - 创建一个不继承自基类的新函数

标签 c++ inheritance

我可以以某种方式在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/

相关文章:

c++ - 将大写字母改为小写字母可以缩短字符串的长度吗?

javascript - JavaScript 中继承的子对象共享相同的数组属性?

css - css 只继承一个属性

c++ - 为什么 mkdir 无法使用波浪号 (~)?

C++派生类继承方法错误

<T> 中的 C# 继承

c++ - 重新定义派生类的变量

C++ 文件输入循环有困难吗?

c++ - 添加基址+偏移量修改值

c++ - 我应该阅读 C++ ISO 标准的哪个 PDF?