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的情况下工作