C++与Java的多态性

kia*_*ian 1 c++ java polymorphism factory

我正在将一些Java代码转换为C++,我希望保持类结构类似.但是,我遇到了以下问题,我不知道如何解决; 我在Java中这样做:

public class Mother {   
    protected Father make;  
    public  Mother(){       
        make = maker();         
        make.print(); };    
    public Father maker(){ 
        return new Father();};}

public class Daughter extends Mother {
    public Daughter(){
        super();}
    @Override
    public Father maker(){
        return new Son();};}

public class Father {
    public void print(){
        System.out.println("I am the Father!\n");}}

public class Son extends Father {
    @Override
    public void print(){
        System.out.println("I am the son!\n");};}

public static void main(String[] args) {
    Daughter dot  = new Daughter();
}
Run Code Online (Sandbox Code Playgroud)

会产生:我是儿子! 而:

class father{
public:
    virtual void print(){
        std::cout << "I am the father!\n";
}; };

class son: public father{
public:
    virtual void print(){
        std::cout << "I am the son!\n";
    };};

class mother{
protected:
    father *make;
public:
    mother(){
        make = maker();
        make->print();
    };
    virtual father *maker(){
        return new father();
    };};

class daughter: public mother{
public:
    daughter(): mother() {
    };
    virtual father *maker(){
        return new son();
    };};


int main(int argc, const char * argv[]) {
    daughter *d = new daughter();
Run Code Online (Sandbox Code Playgroud)

会产生我是父亲!.如何使C++代码生成与Java代码相同的结果?谢谢.

sfj*_*jac 5

Daughter的构造函数调用Mother构造函数,该构造函数调用maker().至少在C++中,Mother由于Daughter构造不完整,该对象仅被认为是此时的对象.因此Mother::maker()被调用,所以这是正确的事情.但是,通常认为在构造过程中调用虚函数会产生强烈的代码气味 - 正是出于这些原因.

在Java中,显然甚至在构造期间也会调用子类覆盖,因此Java中的构造函数永远不应该调用可覆盖的方法.这样做可能会导致未定义的行为.还有就是这是一个非常不错的解释在这里.

  • 需要注意的是,这也是Java中的代码味道. (5认同)