0

除了下面第二个中选择的方法之外,还有一种更简单的方法可以访问类GetJ()中的成员函数吗?Derivedstd::cout

#include <iostream>
#include <memory>

class Base
{
    int i;

    public:

    Base(int k) : i(k) {}
    int GetI() { return i; }
};

class Derived : public Base
{
    int j;

    public:
    Derived(int u) : Base(10) { j = u; }
    int GetJ() { return j; }    
};

int main()
{
    std::unique_ptr<Base> uptr(new Derived(5));
    std::cout << uptr->GetI() << std::endl;
    std::cout << static_cast<Derived*>(uptr.get())->GetJ() << std::endl;
}
4

2 回答 2

0

我相信 GetI 和 GetJ 属于两个不同的类,尽管它们Derived是从Base. 现在的问题取决于如何访问它。

Derived* p = new Derived(5));
std::cout << p->GetI() << std::endl;
std::cout << p->GetJ() << std::endl;

上面的代码应该可以正常工作,因为您是从这些地方派生的。

但如果你真的想合作

Derived* p = new Derived(5));
Base* pBase  = p;
std::cout << pBase->GetI() << std::endl;
std::cout << p->GetJ() << std::endl;

上述方法只是因为功能不是virtual。但是,如果您将函数声明为虚拟函数,则您真的不必为向上转换和向下转换而烦恼。基指针本身足以为您工作

于 2012-08-01T04:20:43.243 回答
0

对于以前版本的问题:

首先,这样做绝对reinterpret_cast是错误的方法。试试这个:

struct A
{
    char x[10]; 
    A():x{9}{}

};

class Derived : public A, public Base
{
// your code here   
};

而不是你的Derived定义。

static_cast在这里工作正常。

到现在的状态:

但是通常当您要通过指向类Derived的指针来使用功能时Base,您需要虚函数:

class Base
{
    //....
    virtual int GetJ() const = 0;
    // or virtual int GetJ() const { return -1;} if Base should be created itself.

    virtual ~Base(){} //oh, and don't forget virtual destructor!
};

class Derived: public Base
{
    //...
    virtual int GetJ() const { return j; }
}
于 2012-07-25T19:38:52.833 回答