Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;在派生类中显示抽象类静态方法 我是从C背景来的,现在想学C++。我使用一个抽象类,它有一个静态成员来跟踪该对象类型的总数,并使用一个静态方法来获取计数。例如: class Shape { public: virtual void Draw() = 0; static int GetShapeCount(); private: static int mShapeCount; };_C++_Class_Inheritance_Static_Abstract Class - Fatal编程技术网

C++;在派生类中显示抽象类静态方法 我是从C背景来的,现在想学C++。我使用一个抽象类,它有一个静态成员来跟踪该对象类型的总数,并使用一个静态方法来获取计数。例如: class Shape { public: virtual void Draw() = 0; static int GetShapeCount(); private: static int mShapeCount; };

C++;在派生类中显示抽象类静态方法 我是从C背景来的,现在想学C++。我使用一个抽象类,它有一个静态成员来跟踪该对象类型的总数,并使用一个静态方法来获取计数。例如: class Shape { public: virtual void Draw() = 0; static int GetShapeCount(); private: static int mShapeCount; };,c++,class,inheritance,static,abstract-class,C++,Class,Inheritance,Static,Abstract Class,我注意到派生类也可以调用抽象类静态方法,我发现这有点奇怪/混乱。例如,如果某人能够做以下事情,他可能会感到困惑: Shape *newShape = new Rectangle(); cout << newShape->GetShapeCount(); Shape*newShape=新矩形(); cout GetShapeCount(); 这意味着获得矩形计数还是形状计数?我还注意到,即使不显式地将其称为shape,也可以通过派生类访问静态方法: Rectangle rec

我注意到派生类也可以调用抽象类静态方法,我发现这有点奇怪/混乱。例如,如果某人能够做以下事情,他可能会感到困惑:

Shape *newShape = new Rectangle();
cout << newShape->GetShapeCount();
Shape*newShape=新矩形();
cout GetShapeCount();
这意味着获得矩形计数还是形状计数?我还注意到,即使不显式地将其称为shape,也可以通过派生类访问静态方法:

Rectangle rectClass = Rectangle();
cout << rectClass.GetShapeCount();
Rectangle rectClass=Rectangle();

CUT< P>不,C++没有多态的静态函数,因此假设<代码>静态GeSeCeCuffNo.()/Cuff>被实现为<代码>返回MsAbCeNoT;代码>,它将返回基类值。然而,使用CRTP和静态多态性可以很容易地模拟这一点。因为从对象而不是从类本身调用静态函数不是一个好的实践,所以这很有吸引力

我还注意到,即使不显式地将其称为shape,也可以通过派生类访问静态方法

您已经声明了
getShapeCount()
public,不是吗?而您(我想也是这样,因为您没有向我们展示足够的代码)使用了公共继承

我注意到派生类也可以调用抽象类静态方法,我发现这有点奇怪/混乱

这与C#中的行为相同:派生类可以访问其基类的所有方法,只要它们的可见性(public、protected、internal等)允许

这意味着获得矩形计数还是形状计数

这是形状计数,因为所有派生类共享同一个计数器

有没有一种方法不允许派生类调用抽象类静态方法

是-您可以通过将方法设置为私有方法来对派生类隐藏方法


如果您想为每个派生类保留单独的对象计数,可以创建一个静态
映射
,并增加特定类型的计数器。但是,您需要为您的
静态
方法提供对调用方类型的访问权限。

它是一个公共方法,不会对代码中的任何内容隐藏。为什么它对派生类是隐藏的?我的问题是为什么我可以从派生类调用抽象类中的静态方法,而不是为什么它不是hidden@DavidTorrey(公共)静态方法是静态方法,是静态方法,句号!'有没有一种方法不允许派生类调用抽象类静态方法?“是的,将方法设置为私有的
或受保护的@戴维托里。。。在C++中,快速测试显示“使用C测试代码不太可能重现任何C++行为!”code>这是指获取矩形计数还是形状计数?为什么会让人困惑?它被称为“GetShapeCount”,所以很明显它是shape计数。但是为什么我可以从派生类调用这个静态方法呢?我不应该只能从基类shape调用静态方法吗?我不明白为什么我能从中调用Shape static方法Rectangle@DavidTorrey为什么?您将函数声明为
public
。您使用公共继承继承了基类。因此,派生类可以访问基类方法。因为它的公共性是建立在派生的基础上的。请注意,这与C#…
的行为完全相同,我不明白为什么我能够从矩形调用Shape static方法,这正是继承的全部目的。我不明白为什么这让你如此困惑。我想我认为继承对于静态方法是不同的“你可以制作一个静态映射,并增加你特定类型的计数器。”这可以通过使用CRTP轻松实现,不需要RTTI.yep。你是对的。很抱歉关键是不要为此使用RTTI。另一方面,它的另一种方式来解决这个问题,也可能更容易地为C++ NoBels++1 1。我很高兴看到C++ 11被认为是C++,而不是另一个怪癖版本。三年过去了,不是吗?
Shape *newShape = new Rectangle();
cout << newShape->GetShapeCount();
Rectangle rectClass = Rectangle();
cout << rectClass.GetShapeCount();
class Rectangle : public Shape
{
public:
// Previous methods

    static int GetShapeCount() = delete; // forbid the usage Rectangle::GetShapeCount()
};