0

我知道我为什么要使用私有虚函数,但我该如何实现它们呢?

例如:

class Base{
[...]
private:
 virtual void func() = 0;
[...]
};

class Derived1: public Base{
  void func() 
  { //short implementation is ok here
  }
};

class Derived2: public Base{
  void func(); //long implementation elsewhere (in cpp file)
};

[...] 

void Derived2::func()
{ //long implementation 
}

第一个版本还可以,但并非总是可行。第二个版本不就是隐藏名字吗?如果你不能在 的类声明中定义 ,你如何Base::func()定义?Derived2Dereived2

谢谢

4

3 回答 3

4

如果你不能在 的类声明中定义 ,你如何Base::func()定义?Derived2Dereived2

您没有定义“ Base::func()of Derived2”(无论这可能是什么),而是定义Derived2::func(). 这对我来说编译得很好:

#include <iostream>

class Base{
private:
 virtual void foo() = 0;
public:
  void bar() {foo();}
};

class Derived: public Base{
  void foo();
};

void Derived::foo()
{
   std::cout << "inside of 'Derived1::foo()'\n";
}

int main()
{
  Derived d;
  Base& b = d;
  b.bar();
  return 0;
}

你有什么问题?

于 2010-03-16T15:10:18.513 回答
3

多态性和可访问性是两个独立的概念。您始终可以覆盖基类的私有虚函数,但除了基类本身之外,您将无法从任何地方调用基类版本。此外,C++ FAQ Lite有一个关于这个主题的相当长的条目。

于 2010-03-16T14:57:42.717 回答
-2

就我在这里的理解而言,您正在尝试进行多态性。

实现多态性必须遵循 4 条规则。

  1. 您必须从基类继承。
  2. 您的函数在每个类中必须具有相同的名称。
  3. 每个函数前面都需要 virtual 关键字,子函数末尾需要 override 关键字。
  4. 您必须在主类上使用指针,并使用“new”关键字将其定义为子类型。

有关代码示例,请参见这个很棒的 wiki 页面

希望这是你想要的。^^

敬上,

西格X

于 2010-03-16T15:12:44.817 回答