我正在用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?或者,我完全忽略了这一点吗?
提前感谢您的时间!
答案 0 :(得分:1)
我对函数和方法参数的经验法则是使用常量引用(const &
)作为必需的输入参数。使用const *
作为输入参数也可以是NULL
,并优先考虑out
或inout
参数的引用指针。这样调用者必须使用&
作为可能被函数/方法修改的参数,并且它更明确。这在传递类和结构的实例时适用。对于简单类型,优先考虑传递值。