c ++多态性和其他功能问题

时间:2010-06-17 13:02:37

标签: c++ polymorphism

我有这个代码:

class father{
public:
    virtual void f() { cout<<1;}
};

class son:public father{
public:
    void f() {cout<<2;}
};

void test (father x){x.f();}

int main(){
    son s;
    test(s);
}
问题是:

  1. 输出为'1',程序员忘记多态的规则是什么,如何修复它以使输出为'2'?

  2. 程序员在编写父类时忘记了另一条规则,他需要添加一个空函数来避免父类的其他儿子出现问题。什么是规则,什么是缺失的功能?


  3. 另一个问题 编写g函数,以便下一个代码可以在没有崩溃的情况下运行

    int x=11; g(x)=22;
    

7 个答案:

答案 0 :(得分:3)

当您按值将son对象传递给测试函数时,它将转换为father对象,因为test需要father,而不是son 1}}。如果要接受子类的实例而不进行转换,则需要通过引用或指针接受参数。

因此,如果您将test的签名更改为void test (father& x),则可以按照您的意愿使用。

答案 1 :(得分:2)

我告诉我的C ++学生(第二年),多态性永远不会偷偷摸摸;首先你需要一个继承层次结构,其次你需要使用指针。

答案 2 :(得分:2)

  1. 儿子传递给测试作为参考,而不是副本。如果s作为副本传递,它将被强制转换为 test 中的对象。通过使用s的引用,它仍然可以正确地表现为 son 对象。

  2. 我认为这是指任何基类都应该有一个虚析构函数的建议。这样,可以通过其基类的指针或引用来正确地销毁对象。

  3. 添加到父亲

    virtual~father(){}

答案 3 :(得分:1)

您按值传递了x。因此编译器会将son对象减少为父对象,包括其虚函数表。如果要在test中调用parent的虚函数,则需要通过引用或指针传递x。

答案 4 :(得分:0)

测试函数是什么让你认为输出是2?

答案 5 :(得分:0)

在函数“test”中,参数“father x”不是对类的引用,它是将从传递的参数复制构造的父实例。

答案 6 :(得分:-1)

你也可以在你的主要问题上做一些关于这个问题的改变,例如指向你的基类我父亲并指出你的子类obj的地址然后根据你的要求进一步使用它。

这就是多态的基本结构。