子类作为超类成员函数中的参数,C++



我是OOP的新手,正在从事C++项目。我隔离了我的问题,使回答变得简单,但这是真实的场景:

我有一个超类成员函数,它修改调用它的对象内部的值。修改是基于来自同一类的另一个对象的值。该对象作为唯一的参数提供给函数。例如:
void BaseClass::function(BaseClass x) {}

然而,我创建了一个子类。如果参数是子类类型,我也想修改它的唯一属性
void BaseClass::function(DerivedClass x) {}

问题是子类显然是在后面的代码中定义的。

我不希望它是两种独立的方法,因为计算算法已经写在里面了,而且我搜索的解决方案不需要在函数已经使用的地方更改代码。此外,脑海中出现的所有其他可能性(例如使用typeid()(看起来都很傻。

#include <iostream>   
#include <string>   
class Base   
{   
protected:   
//common attribute   
const std::string name;   
public:   
//constructor for common attribute   
Base(const std::string nameString) : name(nameString) {}   
//getter   
std::string getName() { return name; }   
//superclass as parameter   
void test1(Base &example) { std::cout << example.getName(); }   
//subclass as parameter (I'd want the line below to work)   
//void test2(Derived &example) { std::cout << example.getNumber(); }   
};   

class Derived : private Base   
{   
protected:   
//unique attribute   
const std::string number;   
public:   
//constructor   
Derived(const std::string nameString, const std::string numberString) : Base(nameString),  
number(numberString) {}
//getter for unique attribute   
std::string getNumber() { return number; }    
};    

int main ()    
{    
Base object = Base("whatever");   
Base baseParameter = Base("base");    
Derived derivedParameter = Derived("derived", "12");    
object.test1(baseParameter);    
//object.test2(derivedParameter);    
return 0;    
}    

做这件事的标准方法是什么?

您可以将test2作为模板,并确保它仅用于从Base:派生的类型

template<typename Derived>
void test2(Derived &example) 
{ 
static_assert(std::is_base_of_v<Base, Derived>);
std::cout << example.getNumber(); 
}

这是一个演示。

最新更新