【问题标题】:c++ virtual function reimplementationc++虚函数重实现
【发布时间】:2011-09-02 04:01:38
【问题描述】:

即使我认为这个问题很愚蠢。但我有一点经验。

我有一个具有这种方法的基类:

class A{  virtual void func(int)=0 };

和继承的类

    class  B :public A
  {  
     //how should i write?
    //a  
       virtual void func() {    implementation...}  

    //b
      void func() {implementation    } 
   //my target is to redefine a function of ansestor
 //i worry that variant b can  cover ansestor function and i will not redefine it
 //but what if i don't want that the function that was virtual in ansestor, will   be      virtual in subclass? 
i'm confused
}

我不知道该怎么做。如果我不需要这个虚函数完成

【问题讨论】:

  • 你有一本关于 C++ 的书吗?这类问题可以通过阅读专门讨论“继承”的章节来回答。
  • 你想通过使重新定义的函数变为非虚拟来实现什么?
  • virtual 关键字在派生类中是可选的,因此您定义了两次相同的函数。
  • 他在询问重写函数时是否需要virtual。他担心在派生类中省略关键字可能会隐藏祖先函数。但如果它不隐藏函数,那么他想知道,如果他真的确实想用非虚拟函数隐藏它怎么办?

标签: c++ oop function virtual


【解决方案1】:

你问,“如果我不希望在 ansestor 中是虚拟的函数在子类中是虚拟的怎么办?”

抱歉,在基类中声明为virtual 的每个函数在所有派生类中也是虚函数。

在派生类声明中是否使用virtual 关键字实际上并不重要。选项 a 和 b 相同——在这两种情况下,B::func 都是虚拟的。

【讨论】:

  • 然而,仅当您打算在派生类中重新定义此函数时才使用 virtual,它会使您的代码更易于理解。
【解决方案2】:

我建议您编写两个小程序,每个实现一个,以确定哪个适合您的需求。

【讨论】:

  • 嗯? virtual 是否包含在 B::func 中并不重要。它们是等价的定义。
  • 我认为这只会引起混淆,因为这两个程序的工作方式相同。这只会为显然已经感到困惑的人提出更多问题。
  • 好吧,我想我们可以不同意。我认为除了您所说的功能之外,它还会有所帮助。
【解决方案3】:

在 C++ 中,函数签名由函数名和函数参数组成。在一个类中,您不能有两个具有相同签名的函数。所以你的第二个(非虚拟)函数声明会产生编译器错误。

简而言之:

virtual void func() { //implementation}

void func() { //implementation }

具有相同的签名,不能在同一个类中声明。

【讨论】:

  • 我认为他不想让两者在同一个班级。 “我的目​​标是重新定义 ansestor 的功能。”他想知道这两种方法中哪一种是正确的。
  • 我猜你是对的,他的描述不是很清楚。
【解决方案4】:

虚拟意味着可以在继承的类中重新实现。无论继承的深度如何,虚函数总是虚函数。

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 2012-04-22
    • 2011-05-28
    • 2015-11-30
    • 2013-07-19
    • 2014-11-21
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多