gpt4 book ai didi

c++ - 将方法参数类型更改为子类中的派生类

转载 作者:行者123 更新时间:2023-11-30 03:22:43 24 4
gpt4 key购买 nike

我正在创建一个数据库接口(interface),并有两个不同的数据库实现来使用这个接口(interface)

例如:

class DBOptions {
protected:
DBOptions();
};

class SQLliteDBOptions : public DBOptions { bool verySpecificSQLiteOption; };
class MySQLDBOptions : public DBOptions{ bool verySpecificMySQLOption; };

class DBIface {
public:
enum FileMode {
READ = 1,
WRITE = 2,
READWRITE = 3
};
public:
virtual bool connect(char * filename, DBIface::FileMode mode, DBOptions * opt) = 0;
virtual bool disconnect() = 0;
};

class SQLiteDB : public DBIface {
public:
bool connect(char * filename, DBIface::FileMode mode, SQLliteDBOptions * options)
{ std::cout << "connect form sqlite\n"; }
bool disconnect() { std::cout << "disconnect from sqlite\n"; }
};

class MySQLDB : public DBIface {
public:
bool connect(char * filename, DBIface::FileMode mode, MySQLDBOptions * options)
{ std::cout << "connect form mysql\n"; }
bool disconnect() { std::cout << "disconnect from mysql\n"; }
};

int main() {
DBIface * sqlitedb = new SQLiteDB();
SQLliteDBOptions * opt = new SQLliteDBOptions();
sqlitedb->connect("file", DBIface::READ, opt);
return 0;
}

两个派生类中的方法 connect 不被视为父类中纯方法的实现。我应该怎么做才能解决这个问题?

我希望我的类(class)接受正确的数据库选项实例。我认为我可以将 DB 选项动态转换为我需要的类型,但我想这不是最佳解决方案。

我是否应该创建一个 setter 方法来为每个数据库实现设置数据库选项?

最佳答案

我会说使选项参数成为派生数据库类型的构造函数的参数。这样派生类型就可以需要正确的选项类型,而不必担心匹配基本签名。 只要 options 参数在任何虚方法上,那么它就必须相同(或通过逆变的基类型)。

关于c++ - 将方法参数类型更改为子类中的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50932513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com