2017-05-02 311 views
-1

下面是我创建新用户或新管理对象的代码,具体取决于boolean isAdmin。用户对象是管理员从此派生的基础对象。我想能够像用户功能一样用户user->adminClasshere。我不知道如何更改它,以便用户=新的管理员创建管理员而不是用户。使用基类调用派生类

User *user; 

if (isAdmin) 
{ 
    user = new Admin(); 
} 
else 
{ 
    user = new User(userLib); //call constructor 

} 

//User User; 
user->loadLibrary(); 
user->displayLibrary(); 
+1

“新管理员”已创建管理员。也许你需要阅读虚拟功能,但如果不知道你面临的具体问题,很难确定。 –

+0

请注意,不应使用原始的新建和删除,请阅读std :: unique_ptr –

+0

请更清楚“user-> adminClasshere”的含义。你想访问公共数据成员吗?或者这是一个成员函数? –

回答

1

您正在将多态性与类扩展混合在一起。
在类扩展中,不能像使用已发现的那样使用指向基类的指针来处理扩展类。
使用多态性,派生类具有相同的接口,但具有不同的实现,因此您可以调用基类的函数,并在使用虚函数时将它分派给实际类的函数。

解决方法是不要这样做:如果你有一个管理员用户,把它作为一个单独的用户类型,不要假装它只是一个普通的用户有一些额外的功能。

不是一个解决方案,但一个解决方法是将用户指针强制转换为所需的类型并使用新的指针。但是,只有在确实需要时才使用它。