将派生类作为虚拟基类传递而不会丢失更改

时间:2014-04-16 14:47:03

标签: c++ class derived-class

我有一个基类和几个非常类似的基础类。他们看起来有点像:

class Base
{
protected:
    data stuff;
    size_t length;
public:
    Base();
    ~Base();
    virtual void print() 
    {
       std::cout << "Base" << std::endl;
    }
    // Some more virtual functions
};

class Der1: public Base
{
public:
    void print()
    {
       std::cout << "Der1" << std::endl;
       Base::print();
    }
};

class Der2: public Base
{
public:
    void print()
    {
       std::cout << "Der2" << std::endl;
       Base::print();
    }
};

这个例子有点愚蠢,但我想说的是派生类并没有真正影响数据本身 - 只有一种方法在实际打印数据之前做了一些事情。

我遇到的问题是我有一些函数可以将Base类作为参数并对数据执行某些操作。问题是 - 我可以将派生类传递给那些函数,但是它们作为Base类传递 - 因此它们会丢失它们的重载print,如果从这样的函数内部打印 - 它将不会打印任何{{1 }或"Der1"字符串到标准输出。

修改:它们将作为"Der2"

传递

所以我的问题是 - 什么是将派生类正确传递给这些函数的方法?

2 个答案:

答案 0 :(得分:1)

看起来你的函数按值Base类作为参数。如果你使用引用传递 - 所以function(Base& object)而不是function(Base object) - 什么都不会丢失。

答案 1 :(得分:0)

除了之前的回答,请参阅下面的示例:

#include <iostream>

class Base
{protected:
int stuff;
size_t length;
public:
Base(){};
~Base(){};
virtual void print()
{std::cout << "Base" << std::endl;}
// Some more virtual functions
};

class Der1: public Base
{public:
Der1(){};
~Der1(){};
void print()
{
   std::cout << "Der1" << std::endl;
   Base::print();
};
};
class Der2: public Base
{public:
void print()
{
   std::cout << "Der2" << std::endl;
   Base::print();
};
};

void function(Base& base)
{
  base.print();
}

int main(void)
{
 Der1 derived;
 function(derived);
 return 0;
}

执行:     Der1     基