Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在派生类中实现私有虚函数?_C++_Virtual_Private Members - Fatal编程技术网

C++ 如何在派生类中实现私有虚函数?

C++ 如何在派生类中实现私有虚函数?,c++,virtual,private-members,C++,Virtual,Private Members,我知道我想使用私有虚拟函数,但如何准确地实现它们呢 例如: 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 e

我知道我想使用私有虚拟函数,但如何准确地实现它们呢

例如:

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 
}
第一个版本可以,但并不总是可能的。 第二个版本不是简单的名字隐藏吗?如果不能在
Derived2的类声明中定义
Base::func()
,如何定义
Derived2的
Base::func()


谢谢

多态性和可访问性是两个独立的概念。您始终可以重写基类的私有虚拟函数,但除了基类本身之外,您将无法从任何位置调用基类版本。另外,在这个主题上有一个相当长的条目。

多态性和可访问性是两个独立的概念。您始终可以重写基类的私有虚拟函数,但除了基类本身之外,您将无法从任何位置调用基类版本。而且,关于这个主题有一个相当长的条目

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

您没有定义
Derived2
的“
Base::func()
”(不管这是什么),而是定义
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;
}
#包括
阶级基础{
私人:
虚拟void foo()=0;
公众:
void bar(){foo();}
};
派生类:公共基{
void foo();
};
void派生::foo()
{
标准::cout
如果不能在
Derived2的类声明中定义
Base::func()
,如何定义
Derived2的
Base::func()

您没有定义
Derived2
的“
Base::func()
”(不管这是什么),而是定义了
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;
}
#包括
阶级基础{
私人:
虚拟void foo()=0;
公众:
void bar(){foo();}
};
派生类:公共基{
void foo();
};
void派生::foo()
{

就我在这里所理解的,你正在尝试做多态性

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

  • 您必须从基类继承
  • 您的函数在每个类中必须具有相同的名称
  • 每个函数前面都需要virtual关键字,子函数末尾需要override关键字
  • 您必须在主类上使用指针,并使用“new”关键字将其定义为子类型
  • 参见下面的代码示例

    希望这是你想要的^^

    真的


    SeargX

    据我所知,您正在尝试执行多态性

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

  • 您必须从基类继承
  • 您的函数在每个类中必须具有相同的名称
  • 每个函数前面都需要virtual关键字,子函数末尾需要override关键字
  • 您必须在主类上使用指针,并使用“new”关键字将其定义为子类型
  • 参见下面的代码示例

    希望这是你想要的^^

    真的



    SeargX

    我的问题是:具体如何实现?@Kristo:如果您通过更改其访问模式的派生类引用私有基类函数(通过
    public:using base::f;
    和使用
    myBase->f()
    ),则可以调用该函数@Kristo,如果基类版本是纯虚拟的,为什么要调用它呢?上下文似乎正在实现模板方法,所以意图是它将只由基类本身调用?我的问题是:具体如何调用?@Kristo:如果通过派生类引用私有基类函数,则可以调用该函数t更改了其访问模式(通过
    public:使用Base::f;
    myBase->f()
    ).@Kristo,如果基类版本是纯虚拟的,为什么要调用它?上下文似乎正在实现模板方法,因此意图是它将只由基类本身调用?为什么它必须是私有的?受保护的会更有意义。请详细说明一下好吗?
    Derived2::func()
    是对
    Base::func()
    的正确重写,到底什么对您不起作用?您能详细说明一下“但并非总是可能”吗?@dbemerlin:有时也称为“非虚拟继承”习惯用法或“模板方法”模式。只需按照问题中的链接进行操作。@Dane:在派生类的声明中为重写提供声明就足够了,不管您是否内联定义它。在这方面,
    Derived1
    Derived2
    是等效的。为什么它必须是私有的?受保护的会更有意义。可以吗请详细说明?
    Derived2::func()
    是对
    Base::func()
    的正确重写,到底什么对您不起作用?能否详细说明“但并非总是可能”@dbemerlin:有时它也被称为“非虚拟继承”习惯用法或“模板方法”模式。只需按照问题中的链接来执行。@ dAN:在派生类声明中提供覆盖的声明就足够了。不管是在内联还是不定义,都不重要。在这方面,<代码>派生< <代码> >和代码>派生<2/代码>是等价的。3和4不适用于C++。嗯,是的,它们可能。也许你不是。强制使用OVVID关键字,这取决于您想做什么,但它确实适用于C++。在C++中,OrrayRead仅作为MS扩展(可能是因为它们必须为C++或CLI实现)。它不是标准C++ +SexGX的一部分:<代码>结构基础{VirtualFor({ }}});Stutt派生:Base{F*({)}};int(){Derived d;Base&b;b.f();}
    不需要在每个函数前面使用
    virtual
    ,根本不使用
    override
    ,并且它在没有指针或
    ne的情况下工作