Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.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++ 派生类cpp中的重写方法_C++ - Fatal编程技术网

C++ 派生类cpp中的重写方法

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

因此,我有一个抽象类(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;
};
模板
甲级{
公众:
虚拟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>;
        }
};