C++ 派生类cpp中的重写方法
因此,我有一个抽象类(A),它有一个方法,该方法接受类型A的参数并返回类型A的参数 现在,我创建了一个派生类,比如B。现在我想用参数覆盖a中定义的方法,返回类型为B 但是当我尝试这样做时,我得到一个编译错误,指出纯虚拟函数没有实现 类A和B都是模板类C++ 派生类cpp中的重写方法,c++,C++,因此,我有一个抽象类(A),它有一个方法,该方法接受类型A的参数并返回类型A的参数 现在,我创建了一个派生类,比如B。现在我想用参数覆盖a中定义的方法,返回类型为B 但是当我尝试这样做时,我得到一个编译错误,指出纯虚拟函数没有实现 类A和B都是模板类 template<typename VALUE_TYPE> class A { public: virtual A<VALUE_TYPE>* ola(const A& other) const = 0
template<typename VALUE_TYPE>
class A {
public:
virtual A<VALUE_TYPE>* ola(const A& other) const = 0;
};
模板
甲级{
公众:
虚拟A*ola(常数A和其他)常数=0;
};
模板
B类:公共A{
公众:
B*ola(食宿及其他){
返回新的B;
}
};
应该是这样的:
template<typename VALUE_TYPE>
class A {
public:
virtual A<VALUE_TYPE>* ola(const A& other) const = 0;
};
template <class T>
class B : public A<T> {
public:
A<T>* ola(const A<T>& other) const {
return new B<T>();
}
};
模板
甲级{
公众:
虚拟A*ola(常数A和其他)常数=0;
};
模板
B类:公共A{
公众:
A*ola(常数A和其他)常数{
返回新的B();
}
};
考虑到您正在更改类B中ola方法的签名,虚拟重写并不能解决问题。所以,为什么不在类B中定义不同的ola方法呢?如果您想访问变量A的成员,那么就将它们声明为受保护的
class A {
public:
A<VALUE_TYPE>* ola(const A& other) const = 0;
protected:
<any member you want to access in derived class>
};
template <class T>
class B: public A<T> {
public:
B<T>* ola(B<T>& other) {
return new B<T>;
}
};
A类{
公众:
A*ola(常数A和其他)常数=0;
受保护的:
};
模板
B类:公共A{
公众:
B*ola(食宿及其他){
返回新的B;
}
};
。。。因为您可能没有在类B中实现来自类A的方法,而是一个具有不同签名的新方法@尼古拉·纳提亚:我明白了。但例如,我在类A中有一个数组,我是否能够创建类型B的对象,向数组中添加值,然后在B中的方法中打印该数组?B继承A,因此根据访问策略,它可以访问A的成员。然后,你应该考虑A是抽象的= >你不能真正创建一个A.的实例,但是对于你已经发布的代码,上面的答案应用程序,你可以做如下的事情:“B.ABC;B*CDE = RealTurtRayStudio(ABC OLA(ABC));”如果你知道它将返回一个B类对象,并且想要访问基类中不可用的特定方法,但这可能看起来很混乱和“肮脏”。如果我定义了其他方法,我仍然需要覆盖右键中存在的Ola方法?我只是想找到一种方法,我只需要重写同一个方法,就不必再做另一个声明了。@Chashmeet那么,另一个答案不满足你的需要吗?@Chashmeet:你不必重写,因为在一个虚拟的系统中,ola将不会是虚拟的。如果您坚持让ola保持虚拟,我想质疑设计本身,因为在派生类中,您正在寻找更改ola签名的方法。不仅仅是可行性,还有一个设计问题。混合模板和虚拟函数不是个好主意。
class A {
public:
A<VALUE_TYPE>* ola(const A& other) const = 0;
protected:
<any member you want to access in derived class>
};
template <class T>
class B: public A<T> {
public:
B<T>* ola(B<T>& other) {
return new B<T>;
}
};