2017-08-25 79 views
-1

我有一个基类多态性与第3级的继承基类的shared_ptr

class Base { 
    public: 
    virtual void func() = 0; 
} 

我有一个具体的派生类

class Derived : public Base { 
    public: 
    void func() {func2();} 
    void func2() {}; 
} 

最后,我有一个派生类

class DerivedDerived : public Derived { 
     // inherits func() from Derived 
     void func2() {} //Overrides func2() from Derived 
} 
void g(shared_ptr<Base> s) { 
    s->func(); 
} 

现在,我的问题是这样的:我有一个函数g(),需要一个shared_ptr <基地>并且调用func()而没有任何类型转换,因为它不知道任何子类。 现在,如果我做的:

shared_ptr<Base> s1 = make_shared<Derived>(); 
shared_ptr<Base> s2 = make_shared<DerivedDerived>(); 
g(s1); //func() of Derived Class called 
g(s2); //func2() of Derived Class called inside, func2() of DerivedDerived Class needed to be called inside. 

我想正确的类的FUNC()调用FUNC2(),我..

+0

什么是问题?没有调用正确的函数吗?你有构建错误吗?崩溃?意外的结果?请详细说明。你有*试过吗?也许你甚至有一个[最小,完整和可验证的例子](http://stackoverflow.com/help/mcve),你可以告诉我们? –

+2

也让'Derived :: func2()''virtual'。 – songyuanyao

+2

*“void func2(){} //覆盖派生”*“中的func2()。不,你只是**隐藏**因为func2不是'虚拟的'。 – Jarod42

回答

0

OK,因为你已经改变了代码 - 我更新结果,正如Jarod42所提到的 - 你隐藏了func2而不是覆盖它。我还按照AlexanderS的建议添加了override关键字。

#include <iostream> 
#include <memory> 

class Base { 
public: 
    virtual void func() = 0; 
}; 

class Derived : public Base { 
public: 
void func() override {func2();} 
virtual void func2() {std::cout << "func2: Derived\n";}; 
} 
; 

class DerivedDerived : public Derived { 
public: 
    void func2() override {std::cout << "func2: DerivedDerived\n";} //Overrides func() from Derived 
}; 
void g(std::shared_ptr<Base> s) { 
    s->func(); 
} 

int main() 
{ 
    std::shared_ptr<Base> s1 = std::make_shared<Derived>(); 
    std::shared_ptr<Base> s2 = std::make_shared<DerivedDerived>(); 
    g(s1); //func() of Derived Class called 
    g(s2); //func() of Derived Class called, func() of DerivedDerived Class needed to 
    return 0; 
} 

/*************** 
Output: 
$ ./test 
func2: Derived 
func2: DerivedDerived 
***************/ 

/* Compiler error when override is used and func2 is not marked virtual 
    src/test.cpp:19:16: error: ‘void DerivedDerived::func2()’ marked ‘override’, but does not override 
     void func2() override {std::cout << "func2: DerivedDerived\n";} //Overrides func() from Derived 
*/ 
1

作为除了本主题,因为C++ 11存在override关键字,至极防止这些类型的错误。当你使用它时,如果你不覆盖你使用关键字的方法,它会抛出一个编译器错误。

class DerivedDerived : public Derived { 
     void func2() {} override; // would throw an error in your case 
}