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 ) {}

如果这足以自己修复它,很好,否则发布您的示例的所有代码。而不是我上面引用的代码中的两行,它应该看起来更像:

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 回答