私はBase
とDerived
という2つのクラスを持っています。 Derived
はBase
から継承し、さらにいくつかの関数と変数を含みます。したがって、2つの別々のクラスを持つ必要があります。しかし、それらは1つの関数、run
を共有します。仮想変数の代替
read
を実行するには、以下の例ではrun
に引数を渡す必要があります。この引数は、オブジェクトが参照するクラスによって異なります。どのオブジェクトがrun
を呼び出すかによって、プログラムが自動的にvars_Base
またはvars_Derived
を使用するようなread
の汎用バージョンを記述することは可能ですか?
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
class Base
{
protected:
void read(std::vector<std::string>);
public:
void run(std::vector<std::string> vars) { read(vars); }
std::vector<std::string> vars_Base;
};
void Base::read(std::vector<std::string> int_vars)
{
for (auto int_vars_it : int_vars)
{
std::cout << int_vars_it << "\n";
}
}
class Derived : public Base
{
protected:
public:
std::vector<std::string> vars_Derived;
///Here are other functions only known to Derived, not Base
};
int main()
{
Base b;
b.vars_Base.push_back("aB");
b.vars_Base.push_back("bB");
b.vars_Base.push_back("cB");
b.run(b.vars_Base);
Derived d;
d.vars_Derived.push_back("aD");
d.vars_Derived.push_back("bD");
d.vars_Derived.push_back("cD");
d.run(d.vars_Derived);
return 0;
}
メンバー変数のコピーを引数として渡すのはなぜですか?メンバー関数がメンバー変数を直接使用するのはなぜですか? –
使用するベクターを参照する(参照する)保護された仮想関数はありますか?あるいは 'run'をvirtualにして派生クラスでそれをオーバーライドしますか? –