当前位置:  开发笔记 > 编程语言 > 正文

C++中的继承

如何解决《C++中的继承》经验,为你挑选了2个好方法。

这是我的问题:我有一个.h文件中定义的虚方法,我想在一个继承自基类的类中调用它.遗憾的是,派生类中的方法不会被调用.有没有更好的方法来实现我正在尝试做的事情?

#ifndef ofxBASE_SND_OBJ
#define ofxBASE_SND_OBJ

#include "ofConstants.h"

class ofxBaseSndObj {

public:

    virtual string getType(){}

    string key;

};

#endif

这是我的口碑课

#ifndef OFXSO_BUZZ
#define OFXSO_BUZZ

#include "ofxBaseSndObj.h"

class ofxSOBuzz : public ofxBaseSndObj
{
public:
    string getType();
};

#endif

ofxSOBuzz.cpp

string ofxSOBuzz::getType()
{
    string s = string("ofxSOBuzz");
    printf(" ********* returning string type %s", s.c_str()); // doesn't get called!
    return s;
}

然后在另一个类中我尝试这样称呼它:

string ofxSndObj::createFilter(ofxBaseSndObj obj)
{
    string str = obj.getType();
    if(str.compare("ofxSOBuzz") == 0)
    {
        printf(" all is well ");
    }
}

在上面的方法中,我需要能够传递所有扩展ofxBaseSndObj对象的多种对象之一.任何建议或指示将不胜感激.谢谢!



1> Martin York..:

改变这一行:

string ofxSndObj::createFilter(ofxBaseSndObj obj)

string ofxSndObj::createFilter(ofxBaseSndObj& obj)

你正在做的是传递价值(传递副本).

这意味着您正在将对象复制到该函数.因为函数不知道你实际传递的是什么类型,所以它只传递函数声明中定义的类型,因此它会生成基类的副本(这就像切片问题一样).

解决方案是通过引用传递.

如果你不希望函数修改对象(也许这就是你传递值的原因所以它不能改变原文)然后传递一个const引用.

class ofxBaseSndObj
{
    public:
        virtual string getType()  const;
        // If the method does not change the object mark it const

        string key;

};

string ofxSndObj::createFilter(ofxBaseSndObj const& obj)
{
    // allowed to call this if getType() is a const
    string str = obj.getType();

    if(str.compare("ofxSOBuzz") == 0)
    {
        printf(" all is well ");
    }
}



2> Rob Walker..:

您需要将实例传递给createFilter作为对象的指针(或引用).您正在通过值传递,这会导致编译器将您用作参数的派生对象复制到基类的实例中.当它这样做时,你会失去它最初是派生类型的事实.

由于ofxBaseSndObj :: getType的声明不返回任何内容,因此编写的代码实际上不应该编译.你是说这是一个抽象方法还是返回一个空字符串?

如果你把它作为一个抽象方法,那么编译器会抱怨你试图在ofxSndObj :: createFilter方法中实例化一个抽象类.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有