在一些书中,声明或继承虚函数的类被称为多态类。
类B没有任何虚函数,但通过了多个is-a测试。
类C有一个虚函数,但没有继承。
class A {};
class B : public A {};
class C
{
public:
virtual void f () {}
};
B类或C类是多态的吗?
我想了解虚拟函数的用途。
让我们分析一下成员函数是非虚函数的代码:
示例1:
struct A
{
void foo1() { cout << "foo 1 from A \n"; }
};
struct B : A
{
void foo1() { cout << "foo 1 from B \n"; }
};
int main()
{
A *a = new B;
a->foo1(); // will print "foo 1 from A \n" because A::foo1
我在Stroustrup C++第4版642页上测试了一个dynamic_cast<>示例,但它不能编译。我直接从书中使用下面的图片,试图了解它是如何工作的。有没有人知道这是Eratta (不在他发布的勘误表文档中),还是我读错了什么? Stroustrup图形,虚线表示受保护: ? #include <iostream>
using namespace std;
// H = Ival_box
class H {
};
// G = Ival_slider
class G : public H {
};
// I = BBwindow
class I {
这里我附加了一个最小的用例,在子类中,cmp将替换父类中的一个,但它不起作用,它总是从父类调用一个
#include <iostream>
template <typename T>
class A
{
public:
void tell(T a, T b)
{
std::cout << (cmp (a, b) ? a : b) << " is better" << std::endl;
}
protected:
我有一个继承自A的类B。
class A
{
};
class B : public A
{
};
我有三个对象。
A* a = new A();
A* a2 = new B();
B* b = new B();
我想知道,如果检查A是A类型的对象,a2是B类型(不是A)的对象,b是B类型的对象。
我试过打字比较,但没有给出正确的答案。
cout << (typeid(*a) == typeid(A)) << endl; // -> 1
cout << (typeid(*a2) == typeid(A)) << endl; // ->
我认为解释我的问题的最简单的方法是展示一个简单的例子来说明我正在尝试做的事情。
我正在使用一个有基类的库作为例子,如下所示。
class base {
void function();
}
现在,派生类是库的一部分,所有派生类都包含相同的函数。
class derived1 : public base {
void derivedFunction();
}
class derived2 : public base {
void derivedFuction();
}
在我创建的函数中,我定义了几个派生类,并构建了一个包含基类的结构。然后,我在数组中设置了几个值,
我必须在C++中创建一个带有一个派生类的基类。最后,我需要证明两个方法void Read和void Show之间的多态性。 完成此操作后,我必须创建一个抽象类对象,其中的基类将是仅包含纯虚方法Read和derived.This的类。 我不认为我完全理解这一点。所以我创建了一个抽象的类对象,我将这两个带"=0“的方法放在其中,以使它们成为纯方法。但这意味着我还必须编辑基类,使其从类Object派生?例如,在此之前: class Base {
} 之后 Class Base : public Object 有人能让我明白吗?
以下是布鲁斯·埃克尔的“Thinking in C++”第一卷(第716页,para2)中的几句话:
“多态是一种不能孤立地看待的特性(例如,像const或switch语句),而只能作为类关系的”大图景“的一部分协同工作。人们经常被C++的其他非面向对象的特性所迷惑,比如重载和默认参数,它们有时被表示为面向对象。不要上当受骗;如果它不是后期绑定,它就不是多态。”
我不能清楚地理解这一点,.Does他的意思是没有像编译时多态性这样的东西?
谁能给我解释一下为什么这段代码打印Base,Derived,但是如果我省略了Base中的f函数,就会打印Base,Base?
#include <iostream>
#include <cstdio>
using namespace std;
class Base;
void testClassType (Base& b);
class Base
{
virtual void f(){};
};
class Derived :public Base
{
};
int main ()
{
Base b;
Derived d;
testClassTy
所以我有一个包含两个派生类的抽象基和一个包含A** arr;的容器;现在,我想重载赋值操作符,但执行arr[i] = new A(other.arr[i]);显然不起作用。我该如何解决这个问题?我需要使用dynamic_cast还是别的什么,或者有更“优雅”的解决方案?
class A {
private:
int someMember;
public:
virtual void someMethod() = 0;
A();
~A();
};
class B : public A
{
private:
int someOtherMember;
publ
我是C++新手,有一个关于成员变量多态性的问题。我有以下类定义-
class Car
{
public:
Car();
virtual int getNumberOfDoors() { return 4; }
};
class ThreeDoorCar : public Car
{
public:
ThreeDoorCar();
int getNumberOfDoors() { return 3; }
};
class CarPrinter
{
public:
CarPrinter(co
如果我的类没有动态分配内存,我们需要一个虚拟析构函数吗?
例如:
class A
{
private:
int a;
int b;
public:
A();
~A();
};
class B: public A
{
private:
int c;
int d;
public:
B();
~B();
};
在这种情况下,我们需要将A的析构函数标记为虚拟的吗?
为什么我收到以下代码的以下错误?
1>C:\Libs\boost_1_44\boost/smart_ptr/shared_ptr.hpp(259): error C2683: 'dynamic_cast' : 'my_namespace::A' is not a polymorphic type
1> D:\[location]\[header_filename].h(35) : see declaration of 'my_namespace::A'
1> C:\Libs\boost_1_4
我正在学习JNI是如何从Java程序调用C++对象方法的。我正在使用Android NDK/SDK编写一个应用程序。我是JNI的初学者,我想知道是否支持多态性。也就是说,假设我有一个简单的C++类:
class HeyBoy
{
public:
virtual int getValue()
{
return 10;
}
};
class HeyBoyDerived1 : public HeyBoy
{
public:
int getValue()
{
作为初学者尝试多态性。我想我正在用不同的语言尝试相同的代码,但结果并不相同:
C++
#include <iostream>
using namespace std;
class A {
public:
void whereami() {
cout << "You're in A" << endl;
}
};
class B : public A {
public:
void whereami() {
cout << "You'
有没有可能在没有虚方法的情况下继承?编译器说下面的代码不是多态的。
示例:
class A {
public:
int a;
int getA(){return a;};
}
class B : public A {
public:
int b;
int getB(){return b;};
}
在另一个类中,我们尝试从A对象向下转换为B对象:
A *a = ...;
B *b = dynamic_cast<B*>(a)
但这会产生以下编译时错误:
cannot dynamic_cast ... (source type is not po
我有一个基类,其中包含许多继承的派生类。如下所示:
class A {
public:
virtual void f(string foo = "bar") {
cout << foo << endl;
}
};
class B: public A {
public:
void f(string foo = "howdy") {
cout << foo << endl;
}
};
class C: public A {
public:
vo
考虑下面的代码片段:
class BaseClass
{
public void SayHi()
{
Console.WriteLine("Hi from base class");
}
public virtual void SayHello()
{
Console.WriteLine("Hello from base class");
}
}
class DerivedClass : BaseClass
{
public void SayHi()
{