Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_Abstract - Fatal编程技术网

C++ 如果不是抽象的,则调用基类方法

C++ 如果不是抽象的,则调用基类方法,c++,templates,abstract,C++,Templates,Abstract,如果基类方法不是抽象的,如何调用它 class WithAbstMethod { public: virtual void do() = 0; } class WithImplMethod : public WithAbstMethod { public: virtual void do() { // do something } } template<typename BaseT> class DerivedClass : BaseT {

如果基类方法不是抽象的,如何调用它

class WithAbstMethod {
public:
    virtual void do() = 0;
}

class WithImplMethod : public WithAbstMethod {
public:
    virtual void do() {
        // do something
    }
}

template<typename BaseT>
class DerivedClass : BaseT {
public:
    virtual void do() {
        BaseT::do(); // here is a question. How to modify code, so that do() is called if it is not abstract?
        // do something
    }
}

void main() {
    DerivedClass<WithAbstMethod> d1;
    d1.do(); // only DerivedClass::do() should be called
    DerivedClass<WithImplMethod> d2;
    d2.do(); // both WithImplMethod::do() and DerivedClass::do() should be called
}
class方法{
公众:
虚空do()=0;
}
WithImplMethod类:public WithMethod{
公众:
虚拟void do(){
//做点什么
}
}
模板
类派生类:BaseT{
公众:
虚拟void do(){
BaseT::do();//这里有一个问题。如何修改代码,以便在do()不是抽象的情况下调用它?
//做点什么
}
}
void main(){
第d1类;
d1.do();//只应调用DerivedClass::do()
衍生的d2类;
d2.do();//应同时调用WithImplMethod::do()和DerivedClass::do()
}
是否可以在编译时使用模板而不需要太多代码(使用BaseT::do()调用实例化DerivedClass::do()方法,而不依赖于BaseT类型)?
显然,在WithMethod类中提供实现不是一个选项。上面的代码是伪代码,因此可能会包含一些小错误。

实际上,为提供一个使用AbsMethod::do()的实现可能是一个选项。抽象函数允许有一个实现

void WithAbstMethod::do()
{
    // do nothing...
}

实际上,使用AbsMethod::do()为
提供一个实现可能是一个选项。抽象函数允许有一个实现

void WithAbstMethod::do()
{
    // do nothing...
}

请注意,代码>是C++中的保留词:注意<代码> do>代码>是C++中的保留词:我不太明白你的意思。这种方法应该是设计抽象的。因此,我希望在这样的代码中出现编译时错误:void main(){WithAbsMethod a1;}那么,您应该已经得到了
void main()
的编译时错误。除此之外,如果
WithAbsMethod::do()
是抽象的,那么如果实现它,仍然会出现编译时错误!啊-你没有注意到你可以实现抽象成员,我猜:你可以<代码>结构A{void B()=0;};void A::B(){}
这是一个抽象类
A
,具有一个实现的抽象函数
A::B()
。例如,这在您的情况下可能很有用。编译器不允许您实例化抽象类(换句话说,在函数声明中保留
=0
)。但是,您仍然可以拥有派生类可以调用的抽象函数的实现。适用于
void
功能,这些功能可以很好地轻松工作;如果你的抽象函数必须返回一些东西,并且没有合理的“默认值”,那么它可能不太合适。哇,这可能是迄今为止最好的答案,至少因为有了新的知识:)。然而,我仍然渴望找到对纯虚拟方法的调用甚至没有编译的解决方案。我不太明白你的意思。这种方法应该是设计抽象的。因此,我希望在这样的代码中出现编译时错误:void main(){WithAbsMethod a1;}那么,您应该已经得到了
void main()
的编译时错误。除此之外,如果
WithAbsMethod::do()
是抽象的,那么如果实现它,仍然会出现编译时错误!啊-你没有注意到你可以实现抽象成员,我猜:你可以<代码>结构A{void B()=0;};void A::B(){}
这是一个抽象类
A
,具有一个实现的抽象函数
A::B()
。例如,这在您的情况下可能很有用。编译器不允许您实例化抽象类(换句话说,在函数声明中保留
=0
)。但是,您仍然可以拥有派生类可以调用的抽象函数的实现。适用于
void
功能,这些功能可以很好地轻松工作;如果你的抽象函数必须返回一些东西,并且没有合理的“默认值”,那么它可能不太合适。哇,这可能是迄今为止最好的答案,至少因为有了新的知识:)。然而,我仍然渴望找到对纯虚拟方法的调用甚至没有编译的解决方案。