在C ++中使用接口中的引用或指针

时间:2015-08-31 09:41:07

标签: c++ pointers reference polymorphism object-slicing

我正在用C ++编写一个库,并且想知道使用引用和/或指针来代替接口(即使用(抽象)基类作为派生类的占位符)。

问题是,我应该选择哪一个?我应该更喜欢彼此吗?使用对(抽象)基类的引用而不是指针有什么不同吗?

请查看以下代码摘录,并对任何问题发表评论:

#include <iostream>

class Base {
    protected:
    public:
        virtual void Print() const {
            std::cout << "Base" << std::endl;
        }
};

class Derived : public Base {
    protected:
    public:
        void Print() const override {
            std::cout << "Derived" << std::endl;
        }
};

class AnotherDerived : public Base {
    protected:
    public:
        void Print() const override {
            std::cout << "Another Derived" << std::endl;
        }
};

void someFunc( const Base& obj ) {
    obj.Print();
}

void anotherFunc( const Base* obj ) {
    obj->Print();
}

int main( int argc, char* argv[] ) {
    Base baseObj, *basePtr;
    Derived derivedObj;
    AnotherDerived anotherDerivedObj;

    someFunc( derivedObj );
    anotherFunc( &derivedObj );
    someFunc( anotherDerivedObj );

    /* slicing ??? */
    baseObj = derivedObj;
    /* another slicing ??? */
    baseObj = anotherDerivedObj;

    /* proper use */
    basePtr = &anotherDerivedObj;

    someFunc( baseObj );
    anotherFunc( basePtr );

    return 0;
}

我想,在上面的代码中,我在将子对象复制分配给父对象时进行了对象切片。但是,假设我没有进行任何对象切片(如前两次调用someFunc),引用方法是否会执行我打算做的事情?在决定调用哪个多态函数时,引用和指针接近内部是否使用dynamic_cast ing?或者,我完全忽略了这一点吗?

提前感谢您的时间!

1 个答案:

答案 0 :(得分:1)

我对函数和方法参数的经验法则是使用常量引用(const &)作为必需的输入参数。使用const *作为输入参数也可以是NULL,并优先考虑outinout参数的引用指针。这样调用者必须使用&作为可能被函数/方法修改的参数,并且它更明确。这在传递类和结构的实例时适用。对于简单类型,优先考虑传递值。