0

わかりました、この例は、私が理解しようとしている概念にとって非常に簡単です。コードを示します。

class Base
{
protected:
    string name;
public:
    virtual string getName() const { return this->name; }
    virtual void setName(string name) { this->name = name; }
....
}

class Derived : public Base
{
private:
    double price;
....
}

main(int argc, char** argv)
{

    Base* base = new Base("Base Class");
    Derived* derived = new Derived(base, 453.21);
    derived->setName("Name changed!");

    cout << "Name of instance: " << base->getName() << endl;

    // Desired effect
        Output: 'Name changed!'
    // Actual effect
        Output: 'Base Class'
....
}

私にとっての問題はこれです。既に作成された基本クラスのインスタンスを参照して派生クラスのインスタンスを作成したいので、派生インスタンスを介して基本クラスのメンバー変数を変更すると、上記の方法で以前に作成された基本インスタンスの変更を確認できます。

注: 私の用語がおそらく少しずれていることは承知しているので、私の言いたいことをなんとか理解していただければ幸いです。厳しくしないでください。:)

注: コンストラクターが存在し、構文が正しくない可能性がある場合、これを行うための最良の方法がわからないため、コンストラクターを表示/作成しません。

4

2 に答える 2

1

これは問題を示しているようです:

Base* base = new Base("Base Class");
Derived* derived = new Derived(base, 453.21);

Base通常、クラスを個別に構築する必要はないためです。派生クラスには既にBase暗黙的にインスタンスが含まれているため、ポインターを手動で追加して ctor から設定する必要はありません。あなたの ctor がどのように見えるかはわかりませんが、次のようになります。

Derived(const std::string& name, double p) : Base(name), price( p ) {}

これで自分で修正するのに十分な場合は、それ以外の場合は、例のすべてのコードを投稿してください。上で引用したコードの 2 行の代わりに、次のようになります。

Derived* derived = new Derived("Base Class", 453.21);

のコードを投稿するとDerived、それは私たちにとって明らかなはずであり、具体的な例で説明するのがはるかに簡単になります.

于 2013-03-29T17:34:37.853 に答える
1

あなたがしようとしている方法は奇妙ですが、次のコードのように継承の概念を簡単に使用できます。

class Base
{
public:
    Base(const string &name) : name(name) {}
    virtual void setName(const string &name) { this->name = name; }
    virtual string getName() const { return name; }
protected:
    string name;
};

class Derived : public Base
{
public:
    Derived(const string &name, double price) : Base(name), price(price) {}
private:
    double price;
};

int main()
{
    Derived* derived = new Derived("Base Class", 453.21);

    derived->setName("Name changed!");

    Base *base = derived;

    cout << "Name of instance: " << base->getName() << endl;
}

出力

インスタンスの名前: 名前が変更されました!

Baseオブジェクトを作成して派生オブジェクトに渡す必要はありません。

代わりに、派生オブジェクトを作成し、そのアドレスをBaseポインターに渡します。

于 2013-03-29T17:42:18.270 に答える