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)



