由子类创建的对象的c++重写函数
C++ override function of object created by subclass
我想知道是否有可能在一个类中重写一个函数而不创建一个全新的类。
我希望bObj1.foo();
输出"foo!",bObj2.foo()
输出"foo?",但目前它们都输出"foo!"。
#include <iostream>
using namespace std;
class B {
public:
virtual void foo() { cout << "foo!" << endl; }
};
class A {
public:
B f();
};
B A::f() {
B bObj;
return bObj;
}
class C : public A {
};
int main()
{
A aObj;
B bObj1 = aObj.f();
bObj1.foo(); // "foo!"
C cObj;
B bObj2 = cObj.f();
bObj2.foo(); // "foo?"
}
您可以通过简单的更改获得您想要的行为,这包括将"虚拟"行为移动到a和C类。
这里我修改了你的应用程序以返回预期的结果:
#include <iostream>
using namespace std;
class A;
class B {
public:
B(A& a) : aref(a) {}
void foo();
private:
A& aref;
};
class A {
public:
B f();
virtual void foo() { cout << "foo!" << endl; }
};
B A::f() {
B bObj(*this);
return bObj;
}
class C : public A {
public:
virtual void foo() { cout << "foo?" << endl; }
};
void B::foo() { aref.foo(); }
int main()
{
A aObj;
B bObj1 = aObj.f();
bObj1.foo(); // "foo!"
C cObj;
B bObj2 = cObj.f();
bObj2.foo(); // "foo?"
}
为了改变虚函数,你必须创建一个新的类型——在c++中没有办法绕过这个。然而,另一种机制——函数对象——可以满足你的需要。
#include <functional>
#include <iostream>
using namespace std;
class B {
public:
B(function<void ()> foo_impl) : foo_impl(foo_impl) {}
void foo() {foo_impl();}
private:
function<void()> foo_impl;
};
class A {
public:
virtual B f();
};
B A::f() {
B bObj([](){cout << "foo!" << endl;});
return bObj;
}
class C : public A {
public:
virtual B f() override;
};
B C::f() {
B bObj([](){cout << "foo?" << endl;});
return bObj;
}
int main()
{
A aObj;
B bObj1 = aObj.f();
bObj1.foo(); // "foo!"
C cObj;
B bObj2 = cObj.f();
bObj2.foo(); // "foo?"
}
相关文章:
- C++调用使用重写函数的父类函数
- 重写函数不打印基类数据
- 在 c++ 中重写函数时如何选择基类?
- 为什么继承的函数忽略了在原始函数中调用的重写函数?
- 在不提供定义的情况下重写函数有什么意义?
- 建议用户使用 lambda 重写函数
- 如何创建使用重写函数的非成员函数?
- 调用重写函数并使用基类中的重载变量
- 重写函数的默认参数
- 从父级调用派生类重写函数.C++
- C++子类中的重写函数成员
- 函数中的指针不称为派生类的重写函数
- 基类数组中重写函数的使用
- 如何使用协变参数重写函数(在抽象基类中)
- c++ 调用子类而不是父类的重写函数
- C++:从模板化基类重写函数
- 使用派生类的类型重写函数参数类型
- c++仅为特定实例重写函数
- 需要一个关于用const参数重写函数的警告
- Qt/C++重写函数而不进行子类化