2012-03-17 101 views
1

下面的代码我想为intA完成两个不同的值,但我得到:简单的C++继承

clsA a = 1? 1 clsB a = 2? 1

//Code 
#include <iostream> 
using namespace std; 
class clsA { 
    static const int intA = 1; 
public: 
    virtual int get_a() { return intA; } 
}; 
class clsB: public clsA { 
    static const int intA = 2; 
}; 
int main() { 
    clsA a; clsB b; 
    cout << "clsA intA = " << a.get_a() << endl; 
    cout << "clsB intA = " << b.get_a() << endl; 
} 

如何获得对象a的intA = 1和对象b的intA = 2? 谢谢你的反应, 安德烈

+1

为什么你有两个'intA's? – 2012-03-17 20:04:01

+0

您正在寻找的是迟到的静态绑定。自从我上次做了C++以来已经有一段时间了。我不记得它是否支持晚期静态绑定。 – 2012-03-17 20:06:58

+0

其实我想要clsA :: intA = 5和clsB :: intA = 8。我有两个intA用于其余的代码,clsA提供5个随机数,clsB提供8个随机数 – 2012-03-17 20:17:38

回答

1

试试这个:

class clsB: public clsA { 
    static const int intA = 2; 
public: 
    virtual int get_a() { return intA; } 
}; 

其他没有工作的原因是,有字面上不存在任何方法clsB :: get_a()。只有一个vtable条目可能附加了这种方法。以上附加了该方法。

0

添加的get_a()的实施clsB

class clsB: public clsA { 
    static const int intA = 2; 
public: 
    virtual int get_a() { return intA; } 
}; 

然而,这是令人困惑的有两个不同的值intA。我建议一个不同的命名方案,如clsB中的intB

+0

他正试图做的是重载静态变量。这并不是那么令人困惑。 – 2012-03-17 20:09:30

+0

@d_inevitable:我认为*很容易混淆,因为C++没有“重载静态变量”的概念。这几乎与'静态'的含义相反。 – 2012-03-17 20:30:23

1

你需要告诉当get_a叫上clsB,它需要返回在同一类中定义的intA编译:

class clsB: public clsA { 
    static const int intA = 2; 
    virtual int get_a() { return intA; } 
}; 

然而,策划东西的这种方式也许不是最好的。考虑到“自动获得正确的价值”的吸引力由于不可能做到这一点而减少了,给常量不同的名字可能是一个好主意。

1

您仍在调用只能看到a基本版本的基本功能。

class clsA { 
    static const int intA = 1; 
public: 
    virtual int get_a() { return intA; } 
}; 
class clsB: public clsA { 
    static const int intA = 2; 
    int get_a() { return intA; } 
}; 

int main() { 
    clsA a; clsB b; 
    cout << "clsA intA = " << a.get_a() << endl; 
    cout << "clsB intA = " << b.get_a() << endl; 
}