栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

关于基类指针返回值的重载,不能基于智能指针返回值重载o

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于基类指针返回值的重载,不能基于智能指针返回值重载o

class C {
 public:
  virtual C f1() { return C(); }
  virtual C* f2() {
    cout << 1 << endl;
    return new C();
  }
};

class D : public C {
 public:
  virtual D f1() override { return D(); }
};

检查f1的重载是明显有问题的,如下。因为这玩意不是个指针。

返回类型与重写虚拟函数 “C::f1” 的返回类型 “C” 既不相同,也不协变C/C++(317)


class D : public C {
 public:
  virtual C* f2() override {
    cout << 2 << endl;
    return new C();
  }
  virtual D* f2() override {
    cout << 3 << endl;
    return new D();
  }
};

上面的例子这里明显的是重复了

c.cpp:49:14: error: ‘virtual D* D::f2()’ cannot be overloaded with ‘virtual C* D::f2()’
   49 |   virtual D* f2() override {
      |              ^~
c.cpp:45:14: note: previous declaration ‘virtual C* D::f2()’
   45 |   virtual C* f2() override {
      |              ^~

class D : public C {
 public:
  virtual D* f2() override {
    cout << 2 << endl;
    return new C();
  }
};

这种类型一看也是不对的。基类向子类转换的错误。

c.cpp: In member function ‘virtual D* D::f2()’:
c.cpp:47:18: error: invalid conversion from ‘C*’ to ‘D*’ [-fpermissive]
   47 |     return new C();
      |                  ^
      |                  |
      |                  C*

class D : public C {
 public:
  virtual D* f2() override {
    cout << 2 << endl;
    return new D();
  }
};


class D : public C {
 public:
  virtual C* f2() override {
    cout << 2 << endl;
    return new D();
  }
};

这两种子类的重载都是可以的。具体的差别就是返回值。
如果不重载默认的返回值明显就是基类了。

下面是例子。(这些都只是说明而已,这里所有的代码返回临时变量指针肯定是不对的。)

class C {
 public:
  virtual C f1() { return C(); }
  virtual C* f2() {
    cout << "xxxxxxxxxxxx" << endl;
    return new C();
  }
};

class D : public C {};

int main() {
  auto v = new D();
  auto vv = v->f2();
  cout << typeid(vv).name() << endl;
}


./a.out 
xxxxxxxxxxxx
P1C
class D : public C {
 public:
  virtual D* f2() override {
    C::f2();
    cout << "ddd" << endl;
    return new D();
  }
};

./a.out 
xxxxxxxxxxxx
ddd
P1D
class D : public C {
 public:
  virtual C* f2() override {
    C::f2();
    cout << "hhhhhhh" << endl;
    return new D();
  }
};


./a.out 
xxxxxxxxxxxx
hhhhhhh
P1C

不能基于基类的智能指针返回值重载

class A {
 public:
  A() {}
  virtual ~A() {}
  virtual shared_ptr f() { return nullptr; };
};

class B : public A {
 public:
  B() {}
  virtual shared_ptr f() { return nullptr; };
};

无法重载
返回类型与重写虚拟函数 "A::f" 的返回类型 "std::shared_ptr" 既不相同,也不协变C/C++(317)

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号