【发布时间】:2012-04-07 17:26:53
【问题描述】:
总结:寻找通过构造函数加载不同文件的标准C++设计模式
我有一个Base 类,它的某些功能将被所有派生类使用(例如Derived_A、Derived_B)。主要区别在于Derived_A 和Derived_B 覆盖load 函数,构造函数使用该函数加载数据文件(load 也可以在构造函数之外显式调用)。
我遇到了一个意想不到的问题:构造函数调用的load函数将类视为Base类型,但是当我使用默认构造函数并显式调用load函数时,虚拟函数表允许调用预期的load 函数。
这听起来像是一个经典问题,但我无法找到解决方法(我最近使用 Python 进行编程,我相信由于弱类型,它总是会调用预期的函数)。
同样,我真的希望Base::load 是纯虚拟/抽象(只有派生类会被实例化);但是,这不会编译(我相信,因为编译器看到将调用纯虚函数)。
你能帮忙吗?
输出:
使用构造函数加载:
Base::加载文件_A
Base::load file_B 加载带函数后期构造:
Derived_A::加载文件_A
Derived_B::加载文件_B
代码:
#include <iostream>
#include <string>
class Base
{
public:
Base() {}
Base(std::string x)
{
load(x);
}
virtual void load(std::string x)
{
std::cout << "\tBase::load " << x << std::endl;
}
};
class Derived_A : public Base
{
public:
Derived_A() {}
Derived_A(std::string x): Base(x) {}
void virtual load(std::string x)
{
std::cout << "\tDerived_A::load " << x << std::endl;
}
};
class Derived_B : public Base
{
public:
Derived_B() {}
Derived_B(std::string x): Base(x) {}
void virtual load(std::string x)
{
std::cout << "\tDerived_B::load " << x << std::endl;
}
};
int main()
{
// simpler code, but it doesn't behave as I hoped
std::cout << "Loading w/ constructor:" << std::endl;
Base*der_a = new Derived_A(std::string("file_A"));
Base*der_b = new Derived_B(std::string("file_B"));
// this is what I want to do
std::cout << "Loading w/ function post construction:" << std::endl;
der_a = new Derived_A;
der_a->load( std::string("file_A") );
der_b = new Derived_B;
der_b->load( std::string("file_B") );
return 0;
}
【问题讨论】:
标签: c++ oop design-patterns